Merge branch 'master' of git://github.com/singularity-viewer/SingularityViewer
This commit is contained in:
@@ -277,8 +277,6 @@ if (LINUX OR DARWIN)
|
||||
set(UNIX_CXX_WARNINGS "${UNIX_WARNINGS}")
|
||||
endif ()
|
||||
|
||||
# Use -DDISABLE_FATAL_WARNINGS:BOOL=FALSE during configuration to enable fatal warnings.
|
||||
set(DISABLE_FATAL_WARNINGS TRUE CACHE BOOL "Set this to FALSE to enable fatal warnings.")
|
||||
if (NOT DISABLE_FATAL_WARNINGS)
|
||||
set(UNIX_WARNINGS "${UNIX_WARNINGS} -Werror")
|
||||
set(UNIX_CXX_WARNINGS "${UNIX_CXX_WARNINGS} -Werror")
|
||||
|
||||
@@ -30,6 +30,7 @@ set(SCRIPTS_DIR ${CMAKE_SOURCE_DIR}/${SCRIPTS_PREFIX})
|
||||
set(VIEWER_DIR ${CMAKE_SOURCE_DIR}/${VIEWER_PREFIX})
|
||||
set(DISABLE_TCMALLOC OFF CACHE BOOL "Disable linkage of TCMalloc. (64bit builds automatically disable TCMalloc)")
|
||||
set(LL_TESTS OFF CACHE BOOL "Build and run unit and integration tests (disable for build timing runs to reduce variation)")
|
||||
set(DISABLE_FATAL_WARNINGS TRUE CACHE BOOL "Set this to FALSE to enable fatal warnings.")
|
||||
|
||||
set(LIBS_PREBUILT_DIR ${CMAKE_SOURCE_DIR}/../libraries CACHE PATH
|
||||
"Location of prebuilt libraries.")
|
||||
|
||||
@@ -45,7 +45,6 @@ import commands
|
||||
class CommandError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
def mkdir(path):
|
||||
try:
|
||||
os.mkdir(path)
|
||||
@@ -54,15 +53,19 @@ def mkdir(path):
|
||||
if err.errno != errno.EEXIST or not os.path.isdir(path):
|
||||
raise
|
||||
|
||||
def getcwd():
|
||||
cwd = os.getcwd()
|
||||
if 'a' <= cwd[0] <= 'z' and cwd[1] == ':':
|
||||
def prettyprint_path_for_cmake(path):
|
||||
if 'a' <= path[0] <= 'z' and path[1] == ':':
|
||||
# CMake wants DOS drive letters to be in uppercase. The above
|
||||
# condition never asserts on platforms whose full path names
|
||||
# always begin with a slash, so we don't need to test whether
|
||||
# we are running on Windows.
|
||||
cwd = cwd[0].upper() + cwd[1:]
|
||||
return cwd
|
||||
path = path[0].upper() + path[1:]
|
||||
return path
|
||||
|
||||
def getcwd():
|
||||
return prettyprint_path_for_cmake(os.getcwd())
|
||||
|
||||
source_indra = prettyprint_path_for_cmake(os.path.dirname(os.path.realpath(__file__)))
|
||||
|
||||
def quote(opts):
|
||||
return '"' + '" "'.join([ opt.replace('"', '') for opt in opts ]) + '"'
|
||||
@@ -150,7 +153,7 @@ class PlatformSetup(object):
|
||||
simple = False
|
||||
try:
|
||||
os.chdir(d)
|
||||
cmd = self.cmake_commandline(cwd, d, args, simple)
|
||||
cmd = self.cmake_commandline(source_indra, d, args, simple)
|
||||
print 'Running %r in %r' % (cmd, d)
|
||||
self.run(cmd, 'cmake')
|
||||
finally:
|
||||
@@ -270,18 +273,9 @@ class LinuxSetup(UnixSetup):
|
||||
return 'linux'
|
||||
|
||||
def build_dirs(self):
|
||||
# Only build the server code if we have it.
|
||||
platform_build = '%s-%s' % (self.platform(), self.build_type.lower())
|
||||
|
||||
if self.arch() == 'i686' and self.is_internal_tree():
|
||||
return ['viewer-' + platform_build, 'server-' + platform_build]
|
||||
elif self.arch() == 'x86_64' and self.is_internal_tree():
|
||||
# the viewer does not build in 64bit -- kdu5 issues
|
||||
# we can either use openjpeg, or overhaul our viewer to handle kdu5 or higher
|
||||
# doug knows about kdu issues
|
||||
return ['server-' + platform_build]
|
||||
else:
|
||||
return ['viewer-' + platform_build]
|
||||
return ['viewer-' + platform_build]
|
||||
|
||||
def cmake_commandline(self, src_dir, build_dir, opts, simple):
|
||||
args = dict(
|
||||
@@ -293,31 +287,11 @@ class LinuxSetup(UnixSetup):
|
||||
type=self.build_type.upper(),
|
||||
project_name=self.project_name,
|
||||
word_size=self.word_size,
|
||||
cxx="g++"
|
||||
)
|
||||
if not self.is_internal_tree():
|
||||
args.update({'cxx':'g++', 'server':'OFF', 'viewer':'ON'})
|
||||
else:
|
||||
if self.distcc:
|
||||
distcc = self.find_in_path('distcc')
|
||||
baseonly = True
|
||||
else:
|
||||
distcc = []
|
||||
baseonly = False
|
||||
if 'server' in build_dir:
|
||||
gcc = distcc + self.find_in_path(
|
||||
self.debian_sarge and 'g++-3.3' or 'g++-4.1',
|
||||
'g++', baseonly)
|
||||
args.update({'cxx': ' '.join(gcc), 'server': 'ON',
|
||||
'viewer': 'OFF'})
|
||||
else:
|
||||
gcc41 = distcc + self.find_in_path('g++-4.1', 'g++', baseonly)
|
||||
args.update({'cxx': ' '.join(gcc41),
|
||||
'server': 'OFF',
|
||||
'viewer': 'ON'})
|
||||
|
||||
cmd = (('cmake -DCMAKE_BUILD_TYPE:STRING=%(type)s '
|
||||
'-G %(generator)r -DSERVER:BOOL=%(server)s '
|
||||
'-DVIEWER:BOOL=%(viewer)s -DSTANDALONE:BOOL=%(standalone)s '
|
||||
'-DUNATTENDED:BOOL=%(unattended)s '
|
||||
'-G %(generator)r -DSTANDALONE:BOOL=%(standalone)s '
|
||||
'-DWORD_SIZE:STRING=%(word_size)s '
|
||||
'-DROOT_PROJECT_NAME:STRING=%(project_name)s '
|
||||
'%(opts)s %(dir)r')
|
||||
|
||||
@@ -1,13 +1,39 @@
|
||||
cmake_minimum_required(VERSION 2.6.4)
|
||||
# -*- cmake -*-
|
||||
|
||||
project(libhacd CXX C)
|
||||
project(libhacd)
|
||||
include(00-Common)
|
||||
|
||||
file (GLOB SOURCE_FILES *.cpp )
|
||||
file (GLOB INCLUDE_FILES *.h )
|
||||
set(libhacd_SOURCE_FILES
|
||||
hacdGraph.cpp
|
||||
hacdHACD.cpp
|
||||
hacdICHull.cpp
|
||||
hacdManifoldMesh.cpp
|
||||
hacdMeshDecimator.cpp
|
||||
hacdMicroAllocator.cpp
|
||||
hacdRaycastMesh.cpp
|
||||
)
|
||||
|
||||
set(libhacd_HEADER_FILES
|
||||
hacdCircularList.h
|
||||
hacdCircularList.inl
|
||||
hacdGraph.h
|
||||
hacdHACD.h
|
||||
hacdICHull.h
|
||||
hacdManifoldMesh.h
|
||||
hacdMeshDecimator.h
|
||||
hacdMicroAllocator.h
|
||||
hacdRaycastMesh.h
|
||||
hacdSArray.h
|
||||
hacdVector.h
|
||||
hacdVector.inl
|
||||
hacdVersion.h
|
||||
)
|
||||
|
||||
set_source_files_properties(${libhacd_HEADER_FILES}
|
||||
PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
|
||||
IF(WINDOWS)
|
||||
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
||||
ENDIF(WINDOWS)
|
||||
|
||||
add_library(hacd ${SOURCE_FILES} ${INCLUDE_FILES})
|
||||
add_library(hacd ${libhacd_SOURCE_FILES} ${libhacd_INCLUDE_FILES})
|
||||
|
||||
@@ -76,6 +76,7 @@ namespace HACD
|
||||
{
|
||||
public:
|
||||
virtual void operator()( char const *aMsg, double aProgress, double aConcavity, size_t aVertices) = 0;
|
||||
virtual ~ICallback() {}
|
||||
};
|
||||
|
||||
typedef ICallback* CallBackFunction;
|
||||
|
||||
@@ -1,9 +1,35 @@
|
||||
# -*- cmake -*-
|
||||
|
||||
project(libndhacd)
|
||||
|
||||
include(00-Common)
|
||||
|
||||
include_directories(${LIBS_OPEN_DIR}/libhacd)
|
||||
|
||||
set (SOURCE_FILES LLConvexDecomposition.cpp nd_hacdConvexDecomposition.cpp nd_hacdStructs.cpp nd_hacdUtils.cpp nd_EnterExitTracer.cpp nd_StructTracer.cpp )
|
||||
file(GLOB HEADER_FILES *.h)
|
||||
set (libndhacd_SOURCE_FILES
|
||||
LLConvexDecomposition.cpp
|
||||
nd_hacdConvexDecomposition.cpp
|
||||
nd_hacdStructs.cpp
|
||||
nd_hacdUtils.cpp
|
||||
nd_EnterExitTracer.cpp
|
||||
nd_StructTracer.cpp
|
||||
)
|
||||
|
||||
add_library( nd_hacdConvexDecomposition STATIC ${SOURCE_FILES} ${HEADER_FILES})
|
||||
set (libndhacd_HEADER_FILES
|
||||
LLConvexDecomposition.h
|
||||
ndConvexDecomposition.h
|
||||
nd_hacdConvexDecomposition.h
|
||||
nd_hacdStructs.h
|
||||
nd_StructTracer.h
|
||||
LLConvexDecompositionStubImpl.h
|
||||
nd_EnterExitTracer.h
|
||||
nd_hacdDefines.h
|
||||
nd_hacdUtils.h
|
||||
windowsincludes.h
|
||||
)
|
||||
|
||||
set_source_files_properties(${libndhacd_HEADER_FILES}
|
||||
PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
|
||||
add_library( nd_hacdConvexDecomposition STATIC ${libndhacd_SOURCE_FILES} ${libndhacd_HEADER_FILES})
|
||||
|
||||
|
||||
@@ -1,13 +1,33 @@
|
||||
cmake_minimum_required(VERSION 2.6.4)
|
||||
# -*- cmake -*-
|
||||
|
||||
project(libpathing)
|
||||
|
||||
include(00-Common)
|
||||
include(LLCommon)
|
||||
include(LLMath)
|
||||
|
||||
include_directories(
|
||||
${LLCOMMON_INCLUDE_DIRS}
|
||||
${LLMATH_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
project(ndPathingLib CXX C)
|
||||
|
||||
if( MSVC )
|
||||
add_definitions(-D_SECURE_SCL=0 -D_CRT_SECURE_NO_WARNINGS=1)
|
||||
endif( MSVC )
|
||||
|
||||
file (GLOB SOURCE_FILES *.cpp )
|
||||
file (GLOB INCLUDE_FILES *.h )
|
||||
set(libpathing_SOURCE_FILES
|
||||
llpathinglib.cpp
|
||||
llphysicsextensions.cpp
|
||||
)
|
||||
|
||||
add_library(nd_Pathing STATIC ${SOURCE_FILES} ${INCLUDE_FILES} )
|
||||
set(libpathing_HEADER_FILES
|
||||
llpathinglib.h
|
||||
llphysicsextensions.h
|
||||
)
|
||||
|
||||
set_source_files_properties(${libpathing_HEADER_FILES}
|
||||
PROPERTIES HEADER_FILE_ONLY TRUE)
|
||||
|
||||
add_library(nd_Pathing STATIC ${libpathing_SOURCE_FILES} ${libpathing_HEADER_FILES} )
|
||||
|
||||
|
||||
@@ -3,37 +3,10 @@
|
||||
|
||||
#include <vector>
|
||||
|
||||
#ifndef LL_V3MATH_H
|
||||
class LLVector3
|
||||
{
|
||||
public:
|
||||
float mV[3];
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef LL_V4COLORU_H
|
||||
class LLColor4U
|
||||
{
|
||||
public:
|
||||
unsigned char mV[4];
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef LL_LLUUID_H
|
||||
class LLUUID
|
||||
{
|
||||
public:
|
||||
unsigned char mData[16];
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef LLQUATERNION_H
|
||||
class LLQuaternion
|
||||
{
|
||||
public:
|
||||
double mQ[4];
|
||||
};
|
||||
#endif
|
||||
#include "v3math.h"
|
||||
#include "v4coloru.h"
|
||||
#include "llquaternion.h"
|
||||
#include "lluuid.h"
|
||||
|
||||
class LLRender;
|
||||
|
||||
@@ -43,7 +16,7 @@ public:
|
||||
enum LLPLResult
|
||||
{
|
||||
LLPL_NO_PATH,
|
||||
LLPL_PATH_GENERATED_OK,
|
||||
LLPL_PATH_GENERATED_OK
|
||||
};
|
||||
|
||||
enum LLPLCharacterType
|
||||
@@ -52,7 +25,7 @@ public:
|
||||
LLPL_CHARACTER_TYPE_A,
|
||||
LLPL_CHARACTER_TYPE_B,
|
||||
LLPL_CHARACTER_TYPE_C,
|
||||
LLPL_CHARACTER_TYPE_D,
|
||||
LLPL_CHARACTER_TYPE_D
|
||||
};
|
||||
|
||||
enum LLShapeType
|
||||
@@ -60,13 +33,13 @@ public:
|
||||
LLST_WalkableObjects = 1,
|
||||
LLST_ObstacleObjects = 2,
|
||||
LLST_MaterialPhantoms = 3,
|
||||
LLST_ExclusionPhantoms = 4,
|
||||
LLST_ExclusionPhantoms = 4
|
||||
};
|
||||
|
||||
enum LLPLRenderType
|
||||
{
|
||||
LLPL_START,
|
||||
LLPL_END,
|
||||
LLPL_END
|
||||
};
|
||||
|
||||
struct Vector
|
||||
@@ -87,9 +60,9 @@ public:
|
||||
operator LLVector3() const
|
||||
{
|
||||
LLVector3 ret;
|
||||
ret.mV[0] = mX;
|
||||
ret.mV[1] = mY;
|
||||
ret.mV[2] = mZ;
|
||||
ret.mV[0] = (F32) mX;
|
||||
ret.mV[1] = (F32) mY;
|
||||
ret.mV[2] = (F32) mZ;
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
#include <map>
|
||||
#include <deque>
|
||||
|
||||
#include "lluuidhashmap.h"
|
||||
#include "llmotion.h"
|
||||
#include "llpose.h"
|
||||
#include "llframetimer.h"
|
||||
|
||||
@@ -234,7 +234,7 @@ set(llcommon_HEADER_FILES
|
||||
lltypeinfolookup.h
|
||||
lluri.h
|
||||
lluuid.h
|
||||
lluuidhashmap.h
|
||||
sguuidhash.h
|
||||
llversionviewer.h.in
|
||||
llworkerthread.h
|
||||
metaclass.h
|
||||
|
||||
@@ -67,7 +67,7 @@ class LL_COMMON_API AIFrameTimer
|
||||
mutable Signal* mCallback; // Pointer to callback struct, or NULL when the object wasn't added to sTimerList yet.
|
||||
|
||||
public:
|
||||
AIRunningFrameTimer(F64 expiration, AIFrameTimer* timer) : mExpire(LLFrameTimer::getElapsedSeconds() + expiration), mCallback(NULL), mTimer(timer) { }
|
||||
AIRunningFrameTimer(F64 expiration, AIFrameTimer* timer) : mExpire(LLFrameTimer::getElapsedSeconds() + expiration), mTimer(timer), mCallback(NULL) { }
|
||||
~AIRunningFrameTimer() { delete mCallback; }
|
||||
|
||||
// This function is called after the final object was added to sTimerList (where it is initialized in-place).
|
||||
@@ -89,7 +89,7 @@ class LL_COMMON_API AIFrameTimer
|
||||
#if LL_DEBUG
|
||||
// May not copy this object after it was initialized.
|
||||
AIRunningFrameTimer(AIRunningFrameTimer const& running_frame_timer) :
|
||||
mExpire(running_frame_timer.mExpire), mCallback(running_frame_timer.mCallback), mTimer(running_frame_timer.mTimer)
|
||||
mExpire(running_frame_timer.mExpire), mTimer(running_frame_timer.mTimer), mCallback(running_frame_timer.mCallback)
|
||||
{ llassert(!mCallback); }
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -403,8 +403,8 @@ void LLCondition::broadcast()
|
||||
|
||||
//============================================================================
|
||||
LLMutexBase::LLMutexBase() :
|
||||
mLockingThread(AIThreadID::sNone),
|
||||
mCount(0)
|
||||
mCount(0),
|
||||
mLockingThread(AIThreadID::sNone)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -1,589 +0,0 @@
|
||||
/**
|
||||
* @file lluuidhashmap.h
|
||||
* @brief A uuid based hash map.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2003&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2003-2009, Linden Research, Inc.
|
||||
*
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifndef LL_LLUUIDHASHMAP_H
|
||||
#define LL_LLUUIDHASHMAP_H
|
||||
|
||||
#include "stdtypes.h"
|
||||
#include "llerror.h"
|
||||
#include "lluuid.h"
|
||||
|
||||
// UUID hash map
|
||||
|
||||
/*
|
||||
LLUUIDHashMap<uuid_pair, 32> foo(test_equals);
|
||||
LLUUIDHashMapIter<uuid_pair, 32> bar(&foo);
|
||||
|
||||
LLDynamicArray<LLUUID> source_ids;
|
||||
const S32 COUNT = 100000;
|
||||
S32 q;
|
||||
for (q = 0; q < COUNT; q++)
|
||||
{
|
||||
llinfos << "Creating" << llendl;
|
||||
LLUUID id;
|
||||
id.generate();
|
||||
//llinfos << q << ":" << id << llendl;
|
||||
uuid_pair pair;
|
||||
pair.mUUID = id;
|
||||
pair.mValue = q;
|
||||
foo.set(id, pair);
|
||||
source_ids.put(id);
|
||||
//ms_sleep(1);
|
||||
}
|
||||
|
||||
uuid_pair cur;
|
||||
llinfos << "Iterating" << llendl;
|
||||
for (cur = bar.first(); !bar.done(); cur = bar.next())
|
||||
{
|
||||
if (source_ids[cur.mValue] != cur.mUUID)
|
||||
{
|
||||
llerrs << "Incorrect value iterated!" << llendl;
|
||||
}
|
||||
//llinfos << cur.mValue << ":" << cur.mUUID << llendl;
|
||||
//ms_sleep(1);
|
||||
}
|
||||
|
||||
llinfos << "Finding" << llendl;
|
||||
for (q = 0; q < COUNT; q++)
|
||||
{
|
||||
cur = foo.get(source_ids[q]);
|
||||
if (source_ids[cur.mValue] != cur.mUUID)
|
||||
{
|
||||
llerrs << "Incorrect value found!" << llendl;
|
||||
}
|
||||
//llinfos << res.mValue << ":" << res.mUUID << llendl;
|
||||
//ms_sleep(1);
|
||||
}
|
||||
|
||||
llinfos << "Removing" << llendl;
|
||||
for (q = 0; q < COUNT/2; q++)
|
||||
{
|
||||
if (!foo.remove(source_ids[q]))
|
||||
{
|
||||
llerrs << "Remove failed!" << llendl;
|
||||
}
|
||||
//ms_sleep(1);
|
||||
}
|
||||
|
||||
llinfos << "Iterating" << llendl;
|
||||
for (cur = bar.first(); !bar.done(); cur = bar.next())
|
||||
{
|
||||
if (source_ids[cur.mValue] != cur.mUUID)
|
||||
{
|
||||
llerrs << "Incorrect value found!" << llendl;
|
||||
}
|
||||
//llinfos << cur.mValue << ":" << cur.mUUID << llendl;
|
||||
//ms_sleep(1);
|
||||
}
|
||||
llinfos << "Done with UUID map test" << llendl;
|
||||
|
||||
return 0;
|
||||
*/
|
||||
|
||||
|
||||
//
|
||||
// LLUUIDHashNode
|
||||
//
|
||||
|
||||
template <class DATA, int SIZE>
|
||||
class LLUUIDHashNode
|
||||
{
|
||||
public:
|
||||
LLUUIDHashNode();
|
||||
|
||||
public:
|
||||
S32 mCount;
|
||||
U8 mKey[SIZE];
|
||||
DATA mData[SIZE];
|
||||
LLUUIDHashNode<DATA, SIZE> *mNextNodep;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// LLUUIDHashNode implementation
|
||||
//
|
||||
template <class DATA, int SIZE>
|
||||
LLUUIDHashNode<DATA, SIZE>::LLUUIDHashNode()
|
||||
{
|
||||
mCount = 0;
|
||||
mNextNodep = NULL;
|
||||
}
|
||||
|
||||
|
||||
template <class DATA_TYPE, int SIZE>
|
||||
class LLUUIDHashMap
|
||||
{
|
||||
public:
|
||||
// basic constructor including sorter
|
||||
LLUUIDHashMap(BOOL (*equals)(const LLUUID &uuid, const DATA_TYPE &data),
|
||||
const DATA_TYPE &null_data);
|
||||
~LLUUIDHashMap();
|
||||
|
||||
inline DATA_TYPE &get(const LLUUID &uuid);
|
||||
inline BOOL check(const LLUUID &uuid) const;
|
||||
inline DATA_TYPE &set(const LLUUID &uuid, const DATA_TYPE &type);
|
||||
inline BOOL remove(const LLUUID &uuid);
|
||||
void removeAll();
|
||||
|
||||
inline S32 getLength() const; // Warning, NOT O(1!)
|
||||
public:
|
||||
BOOL (*mEquals)(const LLUUID &uuid, const DATA_TYPE &data);
|
||||
LLUUIDHashNode<DATA_TYPE, SIZE> mNodes[256];
|
||||
|
||||
S32 mIterCount;
|
||||
protected:
|
||||
DATA_TYPE mNull;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// LLUUIDHashMap implementation
|
||||
//
|
||||
|
||||
template <class DATA_TYPE, int SIZE>
|
||||
LLUUIDHashMap<DATA_TYPE, SIZE>::LLUUIDHashMap(BOOL (*equals)(const LLUUID &uuid, const DATA_TYPE &data),
|
||||
const DATA_TYPE &null_data)
|
||||
: mEquals(equals),
|
||||
mIterCount(0),
|
||||
mNull(null_data)
|
||||
{ }
|
||||
|
||||
template <class DATA_TYPE, int SIZE>
|
||||
LLUUIDHashMap<DATA_TYPE, SIZE>::~LLUUIDHashMap()
|
||||
{
|
||||
removeAll();
|
||||
}
|
||||
|
||||
template <class DATA_TYPE, int SIZE>
|
||||
void LLUUIDHashMap<DATA_TYPE, SIZE>::removeAll()
|
||||
{
|
||||
S32 bin;
|
||||
for (bin = 0; bin < 256; bin++)
|
||||
{
|
||||
LLUUIDHashNode<DATA_TYPE, SIZE>* nodep = &mNodes[bin];
|
||||
|
||||
BOOL first = TRUE;
|
||||
while (nodep)
|
||||
{
|
||||
S32 i;
|
||||
const S32 count = nodep->mCount;
|
||||
|
||||
// Iterate through all members of this node
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
nodep->mData[i] = mNull;
|
||||
}
|
||||
|
||||
nodep->mCount = 0;
|
||||
// Done with all objects in this node, go to the next.
|
||||
|
||||
LLUUIDHashNode<DATA_TYPE, SIZE>* curp = nodep;
|
||||
nodep = nodep->mNextNodep;
|
||||
|
||||
// Delete the node if it's not the first node
|
||||
if (first)
|
||||
{
|
||||
first = FALSE;
|
||||
curp->mNextNodep = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
delete curp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <class DATA_TYPE, int SIZE>
|
||||
inline S32 LLUUIDHashMap<DATA_TYPE, SIZE>::getLength() const
|
||||
{
|
||||
S32 count = 0;
|
||||
S32 bin;
|
||||
for (bin = 0; bin < 256; bin++)
|
||||
{
|
||||
LLUUIDHashNode<DATA_TYPE, SIZE>* nodep = (LLUUIDHashNode<DATA_TYPE, SIZE>*) &mNodes[bin];
|
||||
while (nodep)
|
||||
{
|
||||
count += nodep->mCount;
|
||||
nodep = nodep->mNextNodep;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
template <class DATA_TYPE, int SIZE>
|
||||
inline DATA_TYPE &LLUUIDHashMap<DATA_TYPE, SIZE>::get(const LLUUID &uuid)
|
||||
{
|
||||
LLUUIDHashNode<DATA_TYPE, SIZE>* nodep = &mNodes[uuid.mData[0]];
|
||||
|
||||
// Grab the second byte of the UUID, which is the key for the node data
|
||||
const S32 second_byte = uuid.mData[1];
|
||||
while (nodep)
|
||||
{
|
||||
S32 i;
|
||||
const S32 count = nodep->mCount;
|
||||
|
||||
// Iterate through all members of this node
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
if ((nodep->mKey[i] == second_byte) && mEquals(uuid, nodep->mData[i]))
|
||||
{
|
||||
// The second byte matched, and our equality test passed.
|
||||
// We found it.
|
||||
return nodep->mData[i];
|
||||
}
|
||||
}
|
||||
|
||||
// Done with all objects in this node, go to the next.
|
||||
nodep = nodep->mNextNodep;
|
||||
}
|
||||
return mNull;
|
||||
}
|
||||
|
||||
|
||||
template <class DATA_TYPE, int SIZE>
|
||||
inline BOOL LLUUIDHashMap<DATA_TYPE, SIZE>::check(const LLUUID &uuid) const
|
||||
{
|
||||
const LLUUIDHashNode<DATA_TYPE, SIZE>* nodep = &mNodes[uuid.mData[0]];
|
||||
|
||||
// Grab the second byte of the UUID, which is the key for the node data
|
||||
const S32 second_byte = uuid.mData[1];
|
||||
while (nodep)
|
||||
{
|
||||
S32 i;
|
||||
const S32 count = nodep->mCount;
|
||||
|
||||
// Iterate through all members of this node
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
if ((nodep->mKey[i] == second_byte) && mEquals(uuid, nodep->mData[i]))
|
||||
{
|
||||
// The second byte matched, and our equality test passed.
|
||||
// We found it.
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
// Done with all objects in this node, go to the next.
|
||||
nodep = nodep->mNextNodep;
|
||||
}
|
||||
|
||||
// Didn't find anything
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
template <class DATA_TYPE, int SIZE>
|
||||
inline DATA_TYPE &LLUUIDHashMap<DATA_TYPE, SIZE>::set(const LLUUID &uuid, const DATA_TYPE &data)
|
||||
{
|
||||
// Set is just like a normal find, except that if we find a match
|
||||
// we replace it with the input value.
|
||||
// If we don't find a match, we append to the end of the list.
|
||||
|
||||
LLUUIDHashNode<DATA_TYPE, SIZE>* nodep = &mNodes[uuid.mData[0]];
|
||||
|
||||
const S32 second_byte = uuid.mData[1];
|
||||
while (1)
|
||||
{
|
||||
const S32 count = nodep->mCount;
|
||||
|
||||
S32 i;
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
if ((nodep->mKey[i] == second_byte) && mEquals(uuid, nodep->mData[i]))
|
||||
{
|
||||
// We found a match for this key, replace the data with
|
||||
// the incoming data.
|
||||
nodep->mData[i] = data;
|
||||
return nodep->mData[i];
|
||||
}
|
||||
}
|
||||
if (!nodep->mNextNodep)
|
||||
{
|
||||
// We've iterated through all of the keys without finding a match
|
||||
if (i < SIZE)
|
||||
{
|
||||
// There's still some space on this node, append
|
||||
// the key and data to it.
|
||||
nodep->mKey[i] = second_byte;
|
||||
nodep->mData[i] = data;
|
||||
nodep->mCount++;
|
||||
|
||||
return nodep->mData[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
// This node is full, append a new node to the end.
|
||||
nodep->mNextNodep = new LLUUIDHashNode<DATA_TYPE, SIZE>;
|
||||
nodep->mNextNodep->mKey[0] = second_byte;
|
||||
nodep->mNextNodep->mData[0] = data;
|
||||
nodep->mNextNodep->mCount = 1;
|
||||
|
||||
return nodep->mNextNodep->mData[0];
|
||||
}
|
||||
}
|
||||
|
||||
// No match on this node, go to the next
|
||||
nodep = nodep->mNextNodep;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template <class DATA_TYPE, int SIZE>
|
||||
inline BOOL LLUUIDHashMap<DATA_TYPE, SIZE>::remove(const LLUUID &uuid)
|
||||
{
|
||||
if (mIterCount)
|
||||
{
|
||||
// We don't allow remove when we're iterating, it's bad karma!
|
||||
llerrs << "Attempted remove while an outstanding iterator in LLUUIDHashMap!" << llendl;
|
||||
}
|
||||
// Remove is the trickiest operation.
|
||||
// What we want to do is swap the last element of the last
|
||||
// node if we find the one that we want to remove, but we have
|
||||
// to deal with deleting the node from the tail if it's empty, but
|
||||
// NOT if it's the only node left.
|
||||
|
||||
LLUUIDHashNode<DATA_TYPE, SIZE> *nodep = &mNodes[uuid.mData[0]];
|
||||
|
||||
// Not empty, we need to search through the nodes
|
||||
const S32 second_byte = uuid.mData[1];
|
||||
|
||||
// A modification of the standard search algorithm.
|
||||
while (nodep)
|
||||
{
|
||||
const S32 count = nodep->mCount;
|
||||
|
||||
S32 i;
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
if ((nodep->mKey[i] == second_byte) && mEquals(uuid, nodep->mData[i]))
|
||||
{
|
||||
// We found the node that we want to remove.
|
||||
// Find the last (and next-to-last) node, and the index of the last
|
||||
// element. We could conceviably start from the node we're on,
|
||||
// but that makes it more complicated, this is easier.
|
||||
|
||||
LLUUIDHashNode<DATA_TYPE, SIZE> *prevp = &mNodes[uuid.mData[0]];
|
||||
LLUUIDHashNode<DATA_TYPE, SIZE> *lastp = prevp;
|
||||
|
||||
// Find the last and next-to-last
|
||||
while (lastp->mNextNodep)
|
||||
{
|
||||
prevp = lastp;
|
||||
lastp = lastp->mNextNodep;
|
||||
}
|
||||
|
||||
// First, swap in the last to the current location.
|
||||
nodep->mKey[i] = lastp->mKey[lastp->mCount - 1];
|
||||
nodep->mData[i] = lastp->mData[lastp->mCount - 1];
|
||||
|
||||
// Now, we delete the entry
|
||||
lastp->mCount--;
|
||||
lastp->mData[lastp->mCount] = mNull;
|
||||
|
||||
if (!lastp->mCount)
|
||||
{
|
||||
// We deleted the last element!
|
||||
if (lastp != &mNodes[uuid.mData[0]])
|
||||
{
|
||||
// Only blitz the node if it's not the head
|
||||
// Set the previous node to point to NULL, then
|
||||
// blitz the empty last node
|
||||
prevp->mNextNodep = NULL;
|
||||
delete lastp;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
// Iterate to the next node, we've scanned all the entries in this one.
|
||||
nodep = nodep->mNextNodep;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// LLUUIDHashMapIter
|
||||
//
|
||||
|
||||
template <class DATA_TYPE, int SIZE>
|
||||
class LLUUIDHashMapIter
|
||||
{
|
||||
public:
|
||||
LLUUIDHashMapIter(LLUUIDHashMap<DATA_TYPE, SIZE> *hash_mapp);
|
||||
~LLUUIDHashMapIter();
|
||||
|
||||
|
||||
inline void reset();
|
||||
inline void first();
|
||||
inline void next();
|
||||
inline BOOL done() const;
|
||||
|
||||
DATA_TYPE& operator*() const
|
||||
{
|
||||
return mCurHashNodep->mData[mCurHashNodeKey];
|
||||
}
|
||||
DATA_TYPE* operator->() const
|
||||
{
|
||||
return &(operator*());
|
||||
}
|
||||
|
||||
protected:
|
||||
LLUUIDHashMap<DATA_TYPE, SIZE> *mHashMapp;
|
||||
LLUUIDHashNode<DATA_TYPE, SIZE> *mCurHashNodep;
|
||||
|
||||
S32 mCurHashMapNodeNum;
|
||||
S32 mCurHashNodeKey;
|
||||
|
||||
DATA_TYPE mNull;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// LLUUIDHashMapIter Implementation
|
||||
//
|
||||
template <class DATA_TYPE, int SIZE>
|
||||
LLUUIDHashMapIter<DATA_TYPE, SIZE>::LLUUIDHashMapIter(LLUUIDHashMap<DATA_TYPE, SIZE> *hash_mapp)
|
||||
{
|
||||
mHashMapp = hash_mapp;
|
||||
mCurHashNodep = NULL;
|
||||
mCurHashMapNodeNum = 0;
|
||||
mCurHashNodeKey = 0;
|
||||
}
|
||||
|
||||
template <class DATA_TYPE, int SIZE>
|
||||
LLUUIDHashMapIter<DATA_TYPE, SIZE>::~LLUUIDHashMapIter()
|
||||
{
|
||||
reset();
|
||||
}
|
||||
|
||||
template <class DATA_TYPE, int SIZE>
|
||||
inline void LLUUIDHashMapIter<DATA_TYPE, SIZE>::reset()
|
||||
{
|
||||
if (mCurHashNodep)
|
||||
{
|
||||
// We're partway through an iteration, we can clean up now
|
||||
mHashMapp->mIterCount--;
|
||||
mCurHashNodep = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
template <class DATA_TYPE, int SIZE>
|
||||
inline void LLUUIDHashMapIter<DATA_TYPE, SIZE>::first()
|
||||
{
|
||||
// Iterate through until we find the first non-empty node;
|
||||
S32 i;
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
if (mHashMapp->mNodes[i].mCount)
|
||||
{
|
||||
if (!mCurHashNodep)
|
||||
{
|
||||
// Increment, since it's no longer safe for us to do a remove
|
||||
mHashMapp->mIterCount++;
|
||||
}
|
||||
|
||||
mCurHashNodep = &mHashMapp->mNodes[i];
|
||||
mCurHashMapNodeNum = i;
|
||||
mCurHashNodeKey = 0;
|
||||
//return mCurHashNodep->mData[0];
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Completely empty!
|
||||
mCurHashNodep = NULL;
|
||||
//return mNull;
|
||||
return;
|
||||
}
|
||||
|
||||
template <class DATA_TYPE, int SIZE>
|
||||
inline BOOL LLUUIDHashMapIter<DATA_TYPE, SIZE>::done() const
|
||||
{
|
||||
return mCurHashNodep ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
template <class DATA_TYPE, int SIZE>
|
||||
inline void LLUUIDHashMapIter<DATA_TYPE, SIZE>::next()
|
||||
{
|
||||
// No current entry, this iterator is done
|
||||
if (!mCurHashNodep)
|
||||
{
|
||||
//return mNull;
|
||||
return;
|
||||
}
|
||||
|
||||
// Go to the next element
|
||||
mCurHashNodeKey++;
|
||||
if (mCurHashNodeKey < mCurHashNodep->mCount)
|
||||
{
|
||||
// We're not done with this node, return the current element
|
||||
//return mCurHashNodep->mData[mCurHashNodeKey];
|
||||
return;
|
||||
}
|
||||
|
||||
// Done with this node, move to the next
|
||||
mCurHashNodep = mCurHashNodep->mNextNodep;
|
||||
if (mCurHashNodep)
|
||||
{
|
||||
// Return the first element
|
||||
mCurHashNodeKey = 0;
|
||||
//return mCurHashNodep->mData[0];
|
||||
return;
|
||||
}
|
||||
|
||||
// Find the next non-empty node (keyed on the first byte)
|
||||
mCurHashMapNodeNum++;
|
||||
|
||||
S32 i;
|
||||
for (i = mCurHashMapNodeNum; i < 256; i++)
|
||||
{
|
||||
if (mHashMapp->mNodes[i].mCount)
|
||||
{
|
||||
// We found one that wasn't empty
|
||||
mCurHashNodep = &mHashMapp->mNodes[i];
|
||||
mCurHashMapNodeNum = i;
|
||||
mCurHashNodeKey = 0;
|
||||
//return mCurHashNodep->mData[0];
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// OK, we're done, nothing else to iterate
|
||||
mCurHashNodep = NULL;
|
||||
mHashMapp->mIterCount--; // Decrement since we're safe to do removes now
|
||||
//return mNull;
|
||||
}
|
||||
|
||||
#endif // LL_LLUUIDHASHMAP_H
|
||||
36
indra/llcommon/sguuidhash.h
Normal file
36
indra/llcommon/sguuidhash.h
Normal file
@@ -0,0 +1,36 @@
|
||||
/* Copyright (C) 2013 Siana Gearz
|
||||
*
|
||||
* 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; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* 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 */
|
||||
|
||||
#ifndef SGUUIDHASH_H
|
||||
#define SGUUIDHASH_H
|
||||
|
||||
#include "lluuid.h"
|
||||
#include <boost/functional/hash.hpp>
|
||||
#include <boost/unordered_map.hpp>
|
||||
|
||||
namespace boost {
|
||||
template<> class hash<LLUUID> {
|
||||
public:
|
||||
size_t operator()(const LLUUID& id ) const
|
||||
{
|
||||
return *reinterpret_cast<const size_t*>(id.mData);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
@@ -41,7 +41,7 @@ namespace expression {
|
||||
|
||||
|
||||
//TODO: If we can find a better way to do this with boost::pheonix::bind lets do it
|
||||
namespace { // anonymous
|
||||
//namespace { // anonymous
|
||||
|
||||
template <typename T>
|
||||
T min_glue(T a, T b)
|
||||
@@ -91,7 +91,7 @@ struct lazy_bfunc_
|
||||
}
|
||||
};
|
||||
|
||||
} // end namespace anonymous
|
||||
//} // end namespace anonymous
|
||||
|
||||
template <typename FPT, typename Iterator>
|
||||
struct grammar
|
||||
|
||||
@@ -52,7 +52,8 @@ class AIAverage {
|
||||
U32 mN; // The number of calls to operator().
|
||||
int const mNrOfBuckets; // Size of mData.
|
||||
std::vector<Data> mData; // The buckets.
|
||||
LLMutex mLock; // Mutex for all of the above data.
|
||||
|
||||
mutable LLMutex mLock; // Mutex for all of the above data.
|
||||
|
||||
public:
|
||||
AIAverage(int number_of_buckets) : mCurrentClock(~(U64)0), mTail(0), mCurrentBucket(0), mSum(0), mN(0), mNrOfBuckets(number_of_buckets), mData(number_of_buckets)
|
||||
@@ -88,7 +89,7 @@ class AIAverage {
|
||||
mLock.unlock();
|
||||
return sum;
|
||||
}
|
||||
double getAverage(double avg_no_data)
|
||||
double getAverage(double avg_no_data) const
|
||||
{
|
||||
mLock.lock();
|
||||
double avg = mSum;
|
||||
|
||||
@@ -1251,7 +1251,7 @@ AIPerServicePtr CurlEasyRequest::getPerServicePtr(void)
|
||||
bool CurlEasyRequest::removeFromPerServiceQueue(AICurlEasyRequest const& easy_request) const
|
||||
{
|
||||
// Note that easy_request (must) represent(s) this object; it's just passed for convenience.
|
||||
return mPerServicePtr && PerServiceRequestQueue_wat(*mPerServicePtr)->cancel(easy_request);
|
||||
return mPerServicePtr && PerService_wat(*mPerServicePtr)->cancel(easy_request);
|
||||
}
|
||||
|
||||
std::string CurlEasyRequest::getLowercaseHostname(void) const
|
||||
@@ -1269,7 +1269,8 @@ LLMutex BufferedCurlEasyRequest::sResponderCallbackMutex;
|
||||
bool BufferedCurlEasyRequest::sShuttingDown = false;
|
||||
AIAverage BufferedCurlEasyRequest::sHTTPBandwidth(25);
|
||||
|
||||
BufferedCurlEasyRequest::BufferedCurlEasyRequest() : mRequestTransferedBytes(0), mTotalRawBytes(0), mBufferEventsTarget(NULL), mStatus(HTTP_INTERNAL_ERROR_OTHER)
|
||||
BufferedCurlEasyRequest::BufferedCurlEasyRequest() :
|
||||
mRequestTransferedBytes(0), mTotalRawBytes(0), mStatus(HTTP_INTERNAL_ERROR_OTHER), mBufferEventsTarget(NULL), mQueueIfTooMuchBandwidthUsage(false)
|
||||
{
|
||||
AICurlInterface::Stats::BufferedCurlEasyRequest_count++;
|
||||
}
|
||||
|
||||
@@ -42,10 +42,7 @@
|
||||
#include "llcontrol.h"
|
||||
|
||||
AIPerService::threadsafe_instance_map_type AIPerService::sInstanceMap;
|
||||
LLAtomicS32 AIPerService::sTotalQueued;
|
||||
bool AIPerService::sQueueEmpty;
|
||||
bool AIPerService::sQueueFull;
|
||||
bool AIPerService::sRequestStarvation;
|
||||
AIThreadSafeSimpleDC<AIPerService::TotalQueued> AIPerService::sTotalQueued;
|
||||
|
||||
#undef AICurlPrivate
|
||||
|
||||
@@ -54,14 +51,14 @@ namespace AICurlPrivate {
|
||||
// Cached value of CurlConcurrentConnectionsPerService.
|
||||
U32 CurlConcurrentConnectionsPerService;
|
||||
|
||||
// Friend functions of RefCountedThreadSafePerServiceRequestQueue
|
||||
// Friend functions of RefCountedThreadSafePerService
|
||||
|
||||
void intrusive_ptr_add_ref(RefCountedThreadSafePerServiceRequestQueue* per_service)
|
||||
void intrusive_ptr_add_ref(RefCountedThreadSafePerService* per_service)
|
||||
{
|
||||
per_service->mReferenceCount++;
|
||||
}
|
||||
|
||||
void intrusive_ptr_release(RefCountedThreadSafePerServiceRequestQueue* per_service)
|
||||
void intrusive_ptr_release(RefCountedThreadSafePerService* per_service)
|
||||
{
|
||||
if (--per_service->mReferenceCount == 0)
|
||||
{
|
||||
@@ -74,7 +71,7 @@ void intrusive_ptr_release(RefCountedThreadSafePerServiceRequestQueue* per_servi
|
||||
using namespace AICurlPrivate;
|
||||
|
||||
AIPerService::AIPerService(void) :
|
||||
mQueuedCommands(0), mAdded(0), mQueueEmpty(false),
|
||||
mApprovedRequests(0), mQueuedCommands(0), mAdded(0), mQueueEmpty(false),
|
||||
mQueueFull(false), mRequestStarvation(false), mHTTPBandwidth(25), // 25 = 1000 ms / 40 ms.
|
||||
mConcurrectConnections(CurlConcurrentConnectionsPerService),
|
||||
mMaxPipelinedRequests(CurlConcurrentConnectionsPerService)
|
||||
@@ -194,7 +191,7 @@ AIPerServicePtr AIPerService::instance(std::string const& servicename)
|
||||
AIPerService::iterator iter = instance_map_w->find(servicename);
|
||||
if (iter == instance_map_w->end())
|
||||
{
|
||||
iter = instance_map_w->insert(instance_map_type::value_type(servicename, new RefCountedThreadSafePerServiceRequestQueue)).first;
|
||||
iter = instance_map_w->insert(instance_map_type::value_type(servicename, new RefCountedThreadSafePerService)).first;
|
||||
}
|
||||
// Note: the creation of AIPerServicePtr MUST be protected by the lock on sInstanceMap (see release()).
|
||||
return iter->second;
|
||||
@@ -219,7 +216,7 @@ void AIPerService::release(AIPerServicePtr& instance)
|
||||
return;
|
||||
}
|
||||
// The reference in the map is the last one; that means there can't be any curl easy requests queued for this host.
|
||||
llassert(PerServiceRequestQueue_rat(*instance)->mQueuedRequests.empty());
|
||||
llassert(PerService_rat(*instance)->mQueuedRequests.empty());
|
||||
// Find the host and erase it from the map.
|
||||
iterator const end = instance_map_w->end();
|
||||
for(iterator iter = instance_map_w->begin(); iter != end; ++iter)
|
||||
@@ -256,7 +253,7 @@ void AIPerService::removed_from_multi_handle(void)
|
||||
void AIPerService::queue(AICurlEasyRequest const& easy_request)
|
||||
{
|
||||
mQueuedRequests.push_back(easy_request.get_ptr());
|
||||
sTotalQueued++;
|
||||
TotalQueued_wat(sTotalQueued)->count++;
|
||||
}
|
||||
|
||||
bool AIPerService::cancel(AICurlEasyRequest const& easy_request)
|
||||
@@ -280,8 +277,9 @@ bool AIPerService::cancel(AICurlEasyRequest const& easy_request)
|
||||
prev = cur;
|
||||
}
|
||||
mQueuedRequests.pop_back(); // if this is safe.
|
||||
--sTotalQueued;
|
||||
llassert(sTotalQueued >= 0);
|
||||
TotalQueued_wat total_queued_w(sTotalQueued);
|
||||
total_queued_w->count--;
|
||||
llassert(total_queued_w->count >= 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -291,17 +289,6 @@ void AIPerService::add_queued_to(curlthread::MultiHandle* multi_handle)
|
||||
{
|
||||
multi_handle->add_easy_request(mQueuedRequests.front());
|
||||
mQueuedRequests.pop_front();
|
||||
llassert(sTotalQueued > 0);
|
||||
if (!--sTotalQueued)
|
||||
{
|
||||
// We obtained a request from the queue, and after that there we no more request in any queue.
|
||||
sQueueEmpty = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// We obtained a request from the queue, and even after that there was at least one more request in some queue.
|
||||
sQueueFull = true;
|
||||
}
|
||||
if (mQueuedRequests.empty())
|
||||
{
|
||||
// We obtained a request from the queue, and after that there we no more request in the queue of this host.
|
||||
@@ -312,15 +299,28 @@ void AIPerService::add_queued_to(curlthread::MultiHandle* multi_handle)
|
||||
// We obtained a request from the queue, and even after that there was at least one more request in the queue of this host.
|
||||
mQueueFull = true;
|
||||
}
|
||||
TotalQueued_wat total_queued_w(sTotalQueued);
|
||||
llassert(total_queued_w->count > 0);
|
||||
if (!--(total_queued_w->count))
|
||||
{
|
||||
// We obtained a request from the queue, and after that there we no more request in any queue.
|
||||
total_queued_w->empty = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// We obtained a request from the queue, and even after that there was at least one more request in some queue.
|
||||
total_queued_w->full = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// We can add a new request, but there is none in the queue!
|
||||
mRequestStarvation = true;
|
||||
if (sTotalQueued == 0)
|
||||
TotalQueued_wat total_queued_w(sTotalQueued);
|
||||
if (total_queued_w->count == 0)
|
||||
{
|
||||
// The queue of every host is empty!
|
||||
sRequestStarvation = true;
|
||||
total_queued_w->starvation = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -332,11 +332,12 @@ void AIPerService::purge(void)
|
||||
for (iterator host = instance_map_w->begin(); host != instance_map_w->end(); ++host)
|
||||
{
|
||||
Dout(dc::curl, "Purging queue of host \"" << host->first << "\".");
|
||||
PerServiceRequestQueue_wat per_service_w(*host->second);
|
||||
PerService_wat per_service_w(*host->second);
|
||||
size_t s = per_service_w->mQueuedRequests.size();
|
||||
per_service_w->mQueuedRequests.clear();
|
||||
sTotalQueued -= s;
|
||||
llassert(sTotalQueued >= 0);
|
||||
TotalQueued_wat total_queued_w(sTotalQueued);
|
||||
total_queued_w->count -= s;
|
||||
llassert(total_queued_w->count >= 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -346,7 +347,7 @@ void AIPerService::adjust_concurrent_connections(int increment)
|
||||
instance_map_wat instance_map_w(sInstanceMap);
|
||||
for (AIPerService::iterator iter = instance_map_w->begin(); iter != instance_map_w->end(); ++iter)
|
||||
{
|
||||
PerServiceRequestQueue_wat per_service_w(*iter->second);
|
||||
PerService_wat per_service_w(*iter->second);
|
||||
U32 old_concurrent_connections = per_service_w->mConcurrectConnections;
|
||||
per_service_w->mConcurrectConnections = llclamp(old_concurrent_connections + increment, (U32)1, CurlConcurrentConnectionsPerService);
|
||||
increment = per_service_w->mConcurrectConnections - old_concurrent_connections;
|
||||
@@ -354,3 +355,14 @@ void AIPerService::adjust_concurrent_connections(int increment)
|
||||
}
|
||||
}
|
||||
|
||||
void AIPerService::Approvement::honored(void)
|
||||
{
|
||||
if (!mHonored)
|
||||
{
|
||||
mHonored = true;
|
||||
AICurlPrivate::PerService_wat per_service_w(*mPerServicePtr);
|
||||
llassert(per_service_w->mApprovedRequests > 0);
|
||||
per_service_w->mApprovedRequests--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ class AIPerService;
|
||||
namespace AICurlPrivate {
|
||||
namespace curlthread { class MultiHandle; }
|
||||
|
||||
class RefCountedThreadSafePerServiceRequestQueue;
|
||||
class RefCountedThreadSafePerService;
|
||||
class ThreadSafeBufferedCurlEasyRequest;
|
||||
|
||||
// Forward declaration of BufferedCurlEasyRequestPtr (see aicurlprivate.h).
|
||||
@@ -61,25 +61,25 @@ typedef boost::intrusive_ptr<ThreadSafeBufferedCurlEasyRequest> BufferedCurlEasy
|
||||
|
||||
// AIPerService objects are created by the curl thread and destructed by the main thread.
|
||||
// We need locking.
|
||||
typedef AIThreadSafeSimpleDC<AIPerService> threadsafe_PerServiceRequestQueue;
|
||||
typedef AIAccessConst<AIPerService> PerServiceRequestQueue_crat;
|
||||
typedef AIAccess<AIPerService> PerServiceRequestQueue_rat;
|
||||
typedef AIAccess<AIPerService> PerServiceRequestQueue_wat;
|
||||
typedef AIThreadSafeSimpleDC<AIPerService> threadsafe_PerService;
|
||||
typedef AIAccessConst<AIPerService> PerService_crat;
|
||||
typedef AIAccess<AIPerService> PerService_rat;
|
||||
typedef AIAccess<AIPerService> PerService_wat;
|
||||
|
||||
} // namespace AICurlPrivate
|
||||
|
||||
// We can't put threadsafe_PerServiceRequestQueue in a std::map because you can't copy a mutex.
|
||||
// We can't put threadsafe_PerService in a std::map because you can't copy a mutex.
|
||||
// Therefore, use an intrusive pointer for the threadsafe type.
|
||||
typedef boost::intrusive_ptr<AICurlPrivate::RefCountedThreadSafePerServiceRequestQueue> AIPerServicePtr;
|
||||
typedef boost::intrusive_ptr<AICurlPrivate::RefCountedThreadSafePerService> AIPerServicePtr;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// AIPerService
|
||||
|
||||
// This class provides a static interface to create and maintain instances
|
||||
// of AIPerService objects, so that at any moment there is at most
|
||||
// one instance per hostname:port. Those instances then are used to queue curl
|
||||
// requests when the maximum number of connections for that host already
|
||||
// have been reached.
|
||||
// This class provides a static interface to create and maintain instances of AIPerService objects,
|
||||
// so that at any moment there is at most one instance per service (hostname:port).
|
||||
// Those instances then are used to queue curl requests when the maximum number of connections
|
||||
// for that service already have been reached. And to keep track of the bandwidth usage, and the
|
||||
// number of queued requests in the pipeline, for this service.
|
||||
class AIPerService {
|
||||
private:
|
||||
typedef std::map<std::string, AIPerServicePtr> instance_map_type;
|
||||
@@ -89,7 +89,7 @@ class AIPerService {
|
||||
|
||||
static threadsafe_instance_map_type sInstanceMap; // Map of AIPerService instances with the hostname as key.
|
||||
|
||||
friend class AIThreadSafeSimpleDC<AIPerService>; //threadsafe_PerServiceRequestQueue
|
||||
friend class AIThreadSafeSimpleDC<AIPerService>; // threadsafe_PerService
|
||||
AIPerService(void);
|
||||
|
||||
public:
|
||||
@@ -114,23 +114,66 @@ class AIPerService {
|
||||
private:
|
||||
typedef std::deque<AICurlPrivate::BufferedCurlEasyRequestPtr> queued_request_type;
|
||||
|
||||
int mApprovedRequests; // The number of approved requests by wantsMoreHTTPRequestsFor that were not added to the command queue yet.
|
||||
int mQueuedCommands; // Number of add commands (minus remove commands) with this host in the command queue.
|
||||
int mAdded; // Number of active easy handles with this host.
|
||||
queued_request_type mQueuedRequests; // Waiting (throttled) requests.
|
||||
|
||||
static LLAtomicS32 sTotalQueued; // The sum of mQueuedRequests.size() of all AIPerService objects together.
|
||||
|
||||
bool mQueueEmpty; // Set to true when the queue becomes precisely empty.
|
||||
bool mQueueFull; // Set to true when the queue is popped and then still isn't empty;
|
||||
bool mRequestStarvation; // Set to true when the queue was about to be popped but was already empty.
|
||||
|
||||
static bool sQueueEmpty; // Set to true when sTotalQueued becomes precisely zero as the result of popping any queue.
|
||||
static bool sQueueFull; // Set to true when sTotalQueued is still larger than zero after popping any queue.
|
||||
static bool sRequestStarvation; // Set to true when any queue was about to be popped when sTotalQueued was already zero.
|
||||
|
||||
AIAverage mHTTPBandwidth; // Keeps track on number of bytes received for this service in the past second.
|
||||
int mConcurrectConnections; // The maximum number of allowed concurrent connections to this service.
|
||||
int mMaxPipelinedRequests; // The maximum number of accepted requests that didn't finish yet.
|
||||
int mMaxPipelinedRequests; // The maximum number of accepted requests for this service that didn't finish yet.
|
||||
|
||||
// Global administration of the total number of queued requests of all services combined.
|
||||
private:
|
||||
struct TotalQueued {
|
||||
S32 count; // The sum of mQueuedRequests.size() of all AIPerService objects together.
|
||||
bool empty; // Set to true when count becomes precisely zero as the result of popping any queue.
|
||||
bool full; // Set to true when count is still larger than zero after popping any queue.
|
||||
bool starvation; // Set to true when any queue was about to be popped when count was already zero.
|
||||
TotalQueued(void) : count(0), empty(false), full(false), starvation(false) { }
|
||||
};
|
||||
static AIThreadSafeSimpleDC<TotalQueued> sTotalQueued;
|
||||
typedef AIAccessConst<TotalQueued> TotalQueued_crat;
|
||||
typedef AIAccess<TotalQueued> TotalQueued_rat;
|
||||
typedef AIAccess<TotalQueued> TotalQueued_wat;
|
||||
public:
|
||||
static S32 total_queued_size(void) { return TotalQueued_rat(sTotalQueued)->count; }
|
||||
|
||||
// Global administration of the maximum number of pipelined requests of all services combined.
|
||||
private:
|
||||
struct MaxPipelinedRequests {
|
||||
S32 count; // The maximum total number of accepted requests that didn't finish yet.
|
||||
U64 last_increment; // Last time that sMaxPipelinedRequests was incremented.
|
||||
U64 last_decrement; // Last time that sMaxPipelinedRequests was decremented.
|
||||
MaxPipelinedRequests(void) : count(32), last_increment(0), last_decrement(0) { }
|
||||
};
|
||||
static AIThreadSafeSimpleDC<MaxPipelinedRequests> sMaxPipelinedRequests;
|
||||
typedef AIAccessConst<MaxPipelinedRequests> MaxPipelinedRequests_crat;
|
||||
typedef AIAccess<MaxPipelinedRequests> MaxPipelinedRequests_rat;
|
||||
typedef AIAccess<MaxPipelinedRequests> MaxPipelinedRequests_wat;
|
||||
public:
|
||||
static void setMaxPipelinedRequests(S32 count) { MaxPipelinedRequests_wat(sMaxPipelinedRequests)->count = count; }
|
||||
static void incrementMaxPipelinedRequests(S32 increment) { MaxPipelinedRequests_wat(sMaxPipelinedRequests)->count += increment; }
|
||||
|
||||
// Global administration of throttle fraction (which is the same for all services).
|
||||
private:
|
||||
struct ThrottleFraction {
|
||||
U32 fraction; // A value between 0 and 1024: each service is throttled when it uses more than max_bandwidth * (sThrottleFraction/1024) bandwidth.
|
||||
AIAverage average; // Average of fraction over 25 * 40ms = 1 second.
|
||||
U64 last_add; // Last time that faction was added to average.
|
||||
ThrottleFraction(void) : fraction(1024), average(25), last_add(0) { }
|
||||
};
|
||||
static AIThreadSafeSimpleDC<ThrottleFraction> sThrottleFraction;
|
||||
typedef AIAccessConst<ThrottleFraction> ThrottleFraction_crat;
|
||||
typedef AIAccess<ThrottleFraction> ThrottleFraction_rat;
|
||||
typedef AIAccess<ThrottleFraction> ThrottleFraction_wat;
|
||||
|
||||
static LLAtomicU32 sHTTPThrottleBandwidth125; // HTTPThrottleBandwidth times 125 (in bytes/s).
|
||||
static bool sNoHTTPBandwidthThrottling; // Global override to disable bandwidth throttling.
|
||||
|
||||
public:
|
||||
void added_to_command_queue(void) { ++mQueuedCommands; }
|
||||
@@ -146,19 +189,40 @@ class AIPerService {
|
||||
// Add queued easy handle (if any) to the multi handle. The request is removed from the queue,
|
||||
// followed by either a call to added_to_multi_handle() or to queue() to add it back.
|
||||
|
||||
S32 pipelined_requests(void) const { return mQueuedCommands + mQueuedRequests.size() + mAdded; }
|
||||
static S32 total_queued_size(void) { return sTotalQueued; }
|
||||
S32 pipelined_requests(void) const { return mApprovedRequests + mQueuedCommands + mQueuedRequests.size() + mAdded; }
|
||||
|
||||
AIAverage& bandwidth(void) { return mHTTPBandwidth; }
|
||||
AIAverage const& bandwidth(void) const { return mHTTPBandwidth; }
|
||||
|
||||
static void setNoHTTPBandwidthThrottling(bool nb) { sNoHTTPBandwidthThrottling = nb; }
|
||||
static void setHTTPThrottleBandwidth(F32 max_kbps) { sHTTPThrottleBandwidth125 = 125.f * max_kbps; }
|
||||
static size_t getHTTPThrottleBandwidth125(void) { return sHTTPThrottleBandwidth125; }
|
||||
|
||||
// Called when CurlConcurrentConnectionsPerService changes.
|
||||
static void adjust_concurrent_connections(int increment);
|
||||
|
||||
// The two following functions are static and have the AIPerService object passed
|
||||
// as first argument as an AIPerServicePtr because that avoids the need of having
|
||||
// the AIPerService object locked for the whole duration of the call.
|
||||
// The functions only lock it when access is required.
|
||||
|
||||
// Returns true if curl can handle another request for this host.
|
||||
// Should return false if the maximum allowed HTTP bandwidth is reached, or when
|
||||
// the latency between request and actual delivery becomes too large.
|
||||
static bool wantsMoreHTTPRequestsFor(AIPerServicePtr const& per_service, F32 max_kbps, bool no_bandwidth_throttling);
|
||||
static bool wantsMoreHTTPRequestsFor(AIPerServicePtr const& per_service);
|
||||
// Return true if too much bandwidth is being used.
|
||||
static bool checkBandwidthUsage(AIPerServicePtr const& per_service, U64 sTime_40ms);
|
||||
|
||||
// A helper class to decrement mApprovedRequests after requests approved by wantsMoreHTTPRequestsFor were handled.
|
||||
class Approvement {
|
||||
private:
|
||||
AIPerServicePtr mPerServicePtr;
|
||||
bool mHonored;
|
||||
public:
|
||||
Approvement(AIPerServicePtr const& per_service) : mPerServicePtr(per_service), mHonored(false) { }
|
||||
~Approvement() { honored(); }
|
||||
void honored(void);
|
||||
};
|
||||
|
||||
private:
|
||||
// Disallow copying.
|
||||
@@ -167,17 +231,17 @@ class AIPerService {
|
||||
|
||||
namespace AICurlPrivate {
|
||||
|
||||
class RefCountedThreadSafePerServiceRequestQueue : public threadsafe_PerServiceRequestQueue {
|
||||
class RefCountedThreadSafePerService : public threadsafe_PerService {
|
||||
public:
|
||||
RefCountedThreadSafePerServiceRequestQueue(void) : mReferenceCount(0) { }
|
||||
RefCountedThreadSafePerService(void) : mReferenceCount(0) { }
|
||||
bool exactly_two_left(void) const { return mReferenceCount == 2; }
|
||||
|
||||
private:
|
||||
// Used by AIPerServicePtr. Object is deleted when reference count reaches zero.
|
||||
LLAtomicU32 mReferenceCount;
|
||||
|
||||
friend void intrusive_ptr_add_ref(RefCountedThreadSafePerServiceRequestQueue* p);
|
||||
friend void intrusive_ptr_release(RefCountedThreadSafePerServiceRequestQueue* p);
|
||||
friend void intrusive_ptr_add_ref(RefCountedThreadSafePerService* p);
|
||||
friend void intrusive_ptr_release(RefCountedThreadSafePerService* p);
|
||||
};
|
||||
|
||||
extern U32 CurlConcurrentConnectionsPerService;
|
||||
|
||||
@@ -375,6 +375,9 @@ class BufferedCurlEasyRequest : public CurlEasyRequest {
|
||||
void resetState(void);
|
||||
void prepRequest(AICurlEasyRequest_wat& buffered_curl_easy_request_w, AIHTTPHeaders const& headers, LLHTTPClient::ResponderPtr responder);
|
||||
|
||||
// Called if this request should be queued on the curl thread when too much bandwidth is being used.
|
||||
void queue_if_too_much_bandwidth_usage(void) { mQueueIfTooMuchBandwidthUsage = true; }
|
||||
|
||||
buffer_ptr_t& getInput(void) { return mInput; }
|
||||
buffer_ptr_t& getOutput(void) { return mOutput; }
|
||||
|
||||
@@ -416,6 +419,7 @@ class BufferedCurlEasyRequest : public CurlEasyRequest {
|
||||
U32 mRequestTransferedBytes;
|
||||
size_t mTotalRawBytes; // Raw body data (still, possibly, compressed) received from the server so far.
|
||||
AIBufferedCurlEasyRequestEvents* mBufferEventsTarget;
|
||||
bool mQueueIfTooMuchBandwidthUsage; // Set if the curl thread should check bandwidth usage and queue this request if too much is being used.
|
||||
|
||||
public:
|
||||
static LLChannelDescriptors const sChannels; // Channel object for mInput (channel out()) and mOutput (channel in()).
|
||||
@@ -452,6 +456,9 @@ class BufferedCurlEasyRequest : public CurlEasyRequest {
|
||||
// Return true when prepRequest was already called and the object has not been
|
||||
// invalidated as a result of calling timed_out().
|
||||
bool isValid(void) const { return mResponder; }
|
||||
|
||||
// Returns true when this request should be queued by the curl thread when too much bandwidth is being used.
|
||||
bool queueIfTooMuchBandwidthUsage(void) const { return mQueueIfTooMuchBandwidthUsage; }
|
||||
};
|
||||
|
||||
inline ThreadSafeBufferedCurlEasyRequest* CurlEasyRequest::get_lockobj(void)
|
||||
|
||||
@@ -206,8 +206,6 @@ int ioctlsocket(int fd, int, unsigned long* nonblocking_enable)
|
||||
|
||||
namespace AICurlPrivate {
|
||||
|
||||
LLAtomicS32 max_pipelined_requests(32);
|
||||
|
||||
enum command_st {
|
||||
cmd_none,
|
||||
cmd_add,
|
||||
@@ -890,7 +888,7 @@ AICurlThread* AICurlThread::sInstance = NULL;
|
||||
AICurlThread::AICurlThread(void) : LLThread("AICurlThread"),
|
||||
mWakeUpFd_in(CURL_SOCKET_BAD),
|
||||
mWakeUpFd(CURL_SOCKET_BAD),
|
||||
mZeroTimeout(0), mRunning(true), mWakeUpFlag(false)
|
||||
mZeroTimeout(0), mWakeUpFlag(false), mRunning(true)
|
||||
{
|
||||
create_wakeup_fds();
|
||||
sInstance = this;
|
||||
@@ -1333,11 +1331,11 @@ void AICurlThread::process_commands(AICurlMultiHandle_wat const& multi_handle_w)
|
||||
case cmd_boost: // FIXME: future stuff
|
||||
break;
|
||||
case cmd_add:
|
||||
PerServiceRequestQueue_wat(*AICurlEasyRequest_wat(*command_being_processed_r->easy_request())->getPerServicePtr())->removed_from_command_queue();
|
||||
PerService_wat(*AICurlEasyRequest_wat(*command_being_processed_r->easy_request())->getPerServicePtr())->removed_from_command_queue();
|
||||
multi_handle_w->add_easy_request(AICurlEasyRequest(command_being_processed_r->easy_request()));
|
||||
break;
|
||||
case cmd_remove:
|
||||
PerServiceRequestQueue_wat(*AICurlEasyRequest_wat(*command_being_processed_r->easy_request())->getPerServicePtr())->added_to_command_queue(); // Not really, but this has the same effect as 'removed a remove command'.
|
||||
PerService_wat(*AICurlEasyRequest_wat(*command_being_processed_r->easy_request())->getPerServicePtr())->added_to_command_queue(); // Not really, but this has the same effect as 'removed a remove command'.
|
||||
multi_handle_w->remove_easy_request(AICurlEasyRequest(command_being_processed_r->easy_request()), true);
|
||||
break;
|
||||
}
|
||||
@@ -1710,8 +1708,9 @@ void MultiHandle::add_easy_request(AICurlEasyRequest const& easy_request)
|
||||
{
|
||||
AICurlEasyRequest_wat curl_easy_request_w(*easy_request);
|
||||
per_service = curl_easy_request_w->getPerServicePtr();
|
||||
PerServiceRequestQueue_wat per_service_w(*per_service);
|
||||
if (mAddedEasyRequests.size() < curl_max_total_concurrent_connections && !per_service_w->throttled())
|
||||
bool too_much_bandwidth = curl_easy_request_w->queueIfTooMuchBandwidthUsage() && AIPerService::checkBandwidthUsage(per_service, get_clock_count() * HTTPTimeout::sClockWidth_40ms);
|
||||
PerService_wat per_service_w(*per_service);
|
||||
if (!too_much_bandwidth && mAddedEasyRequests.size() < curl_max_total_concurrent_connections && !per_service_w->throttled())
|
||||
{
|
||||
curl_easy_request_w->set_timeout_opts();
|
||||
if (curl_easy_request_w->add_handle_to_multi(curl_easy_request_w, mMultiHandle) == CURLM_OK)
|
||||
@@ -1723,7 +1722,10 @@ void MultiHandle::add_easy_request(AICurlEasyRequest const& easy_request)
|
||||
} // Release the lock on easy_request.
|
||||
if (!throttled)
|
||||
{ // ... to here.
|
||||
std::pair<addedEasyRequests_type::iterator, bool> res = mAddedEasyRequests.insert(easy_request);
|
||||
#ifdef SHOW_ASSERT
|
||||
std::pair<addedEasyRequests_type::iterator, bool> res =
|
||||
#endif
|
||||
mAddedEasyRequests.insert(easy_request);
|
||||
llassert(res.second); // May not have been added before.
|
||||
sTotalAdded++;
|
||||
llassert(sTotalAdded == mAddedEasyRequests.size());
|
||||
@@ -1732,7 +1734,7 @@ void MultiHandle::add_easy_request(AICurlEasyRequest const& easy_request)
|
||||
return;
|
||||
}
|
||||
// The request could not be added, we have to queue it.
|
||||
PerServiceRequestQueue_wat(*per_service)->queue(easy_request);
|
||||
PerService_wat(*per_service)->queue(easy_request);
|
||||
#ifdef SHOW_ASSERT
|
||||
// Not active yet, but it's no longer an error if next we try to remove the request.
|
||||
AICurlEasyRequest_wat(*easy_request)->mRemovedPerCommand = false;
|
||||
@@ -1770,7 +1772,7 @@ CURLMcode MultiHandle::remove_easy_request(addedEasyRequests_type::iterator cons
|
||||
AICurlEasyRequest_wat curl_easy_request_w(**iter);
|
||||
res = curl_easy_request_w->remove_handle_from_multi(curl_easy_request_w, mMultiHandle);
|
||||
per_service = curl_easy_request_w->getPerServicePtr();
|
||||
PerServiceRequestQueue_wat(*per_service)->removed_from_multi_handle(); // (About to be) removed from mAddedEasyRequests.
|
||||
PerService_wat(*per_service)->removed_from_multi_handle(); // (About to be) removed from mAddedEasyRequests.
|
||||
#ifdef SHOW_ASSERT
|
||||
curl_easy_request_w->mRemovedPerCommand = as_per_command;
|
||||
#endif
|
||||
@@ -1787,7 +1789,7 @@ CURLMcode MultiHandle::remove_easy_request(addedEasyRequests_type::iterator cons
|
||||
#endif
|
||||
|
||||
// Attempt to add a queued request, if any.
|
||||
PerServiceRequestQueue_wat(*per_service)->add_queued_to(this);
|
||||
PerService_wat(*per_service)->add_queued_to(this);
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -2120,7 +2122,7 @@ void BufferedCurlEasyRequest::update_body_bandwidth(void)
|
||||
if (raw_bytes > 0)
|
||||
{
|
||||
U64 const sTime_40ms = curlthread::HTTPTimeout::sTime_10ms >> 2;
|
||||
AIAverage& http_bandwidth(PerServiceRequestQueue_wat(*getPerServicePtr())->bandwidth());
|
||||
AIAverage& http_bandwidth(PerService_wat(*getPerServicePtr())->bandwidth());
|
||||
http_bandwidth.addData(raw_bytes, sTime_40ms);
|
||||
sHTTPBandwidth.addData(raw_bytes, sTime_40ms);
|
||||
}
|
||||
@@ -2215,7 +2217,7 @@ size_t BufferedCurlEasyRequest::curlHeaderCallback(char* data, size_t size, size
|
||||
}
|
||||
// Update HTTP bandwidth.
|
||||
U64 const sTime_40ms = curlthread::HTTPTimeout::sTime_10ms >> 2;
|
||||
AIAverage& http_bandwidth(PerServiceRequestQueue_wat(*self_w->getPerServicePtr())->bandwidth());
|
||||
AIAverage& http_bandwidth(PerService_wat(*self_w->getPerServicePtr())->bandwidth());
|
||||
http_bandwidth.addData(header_len, sTime_40ms);
|
||||
sHTTPBandwidth.addData(header_len, sTime_40ms);
|
||||
// Update timeout administration. This must be done after the status is already known.
|
||||
@@ -2421,7 +2423,7 @@ void AICurlEasyRequest::addRequest(void)
|
||||
command_queue_w->commands.push_back(Command(*this, cmd_add));
|
||||
command_queue_w->size++;
|
||||
AICurlEasyRequest_wat curl_easy_request_w(*get());
|
||||
PerServiceRequestQueue_wat(*curl_easy_request_w->getPerServicePtr())->added_to_command_queue();
|
||||
PerService_wat(*curl_easy_request_w->getPerServicePtr())->added_to_command_queue();
|
||||
curl_easy_request_w->add_queued();
|
||||
}
|
||||
// Something was added to the queue, wake up the thread to get it.
|
||||
@@ -2485,7 +2487,7 @@ void AICurlEasyRequest::removeRequest(void)
|
||||
command_queue_w->commands.push_back(Command(*this, cmd_remove));
|
||||
command_queue_w->size--;
|
||||
AICurlEasyRequest_wat curl_easy_request_w(*get());
|
||||
PerServiceRequestQueue_wat(*curl_easy_request_w->getPerServicePtr())->removed_from_command_queue(); // Note really, but this has the same effect as 'added a remove command'.
|
||||
PerService_wat(*curl_easy_request_w->getPerServicePtr())->removed_from_command_queue(); // Note really, but this has the same effect as 'added a remove command'.
|
||||
// Suppress warning that would otherwise happen if the callbacks are revoked before the curl thread removed the request.
|
||||
curl_easy_request_w->remove_queued();
|
||||
}
|
||||
@@ -2511,7 +2513,8 @@ void startCurlThread(LLControlGroup* control_group)
|
||||
curl_max_total_concurrent_connections = sConfigGroup->getU32("CurlMaxTotalConcurrentConnections");
|
||||
CurlConcurrentConnectionsPerService = sConfigGroup->getU32("CurlConcurrentConnectionsPerService");
|
||||
gNoVerifySSLCert = sConfigGroup->getBOOL("NoVerifySSLCert");
|
||||
max_pipelined_requests = curl_max_total_concurrent_connections;
|
||||
AIPerService::setMaxPipelinedRequests(curl_max_total_concurrent_connections);
|
||||
AIPerService::setHTTPThrottleBandwidth(sConfigGroup->getF32("HTTPThrottleBandwidth"));
|
||||
|
||||
AICurlThread::sInstance = new AICurlThread;
|
||||
AICurlThread::sInstance->start();
|
||||
@@ -2524,7 +2527,7 @@ bool handleCurlMaxTotalConcurrentConnections(LLSD const& newvalue)
|
||||
|
||||
U32 old = curl_max_total_concurrent_connections;
|
||||
curl_max_total_concurrent_connections = newvalue.asInteger();
|
||||
max_pipelined_requests += curl_max_total_concurrent_connections - old;
|
||||
AIPerService::incrementMaxPipelinedRequests(curl_max_total_concurrent_connections - old);
|
||||
llinfos << "CurlMaxTotalConcurrentConnections set to " << curl_max_total_concurrent_connections << llendl;
|
||||
return true;
|
||||
}
|
||||
@@ -2574,6 +2577,12 @@ size_t getHTTPBandwidth(void)
|
||||
|
||||
} // namespace AICurlInterface
|
||||
|
||||
// Global AIPerService members.
|
||||
AIThreadSafeSimpleDC<AIPerService::MaxPipelinedRequests> AIPerService::sMaxPipelinedRequests;
|
||||
AIThreadSafeSimpleDC<AIPerService::ThrottleFraction> AIPerService::sThrottleFraction;
|
||||
LLAtomicU32 AIPerService::sHTTPThrottleBandwidth125(250000);
|
||||
bool AIPerService::sNoHTTPBandwidthThrottling;
|
||||
|
||||
// Return true if we want at least one more HTTP request for this host.
|
||||
//
|
||||
// It's OK if this function is a bit fuzzy, but we don't want it to return
|
||||
@@ -2599,46 +2608,55 @@ size_t getHTTPBandwidth(void)
|
||||
// running requests (in MultiHandle::mAddedEasyRequests)).
|
||||
//
|
||||
//static
|
||||
bool AIPerService::wantsMoreHTTPRequestsFor(AIPerServicePtr const& per_service, F32 max_kbps, bool no_bandwidth_throttling)
|
||||
bool AIPerService::wantsMoreHTTPRequestsFor(AIPerServicePtr const& per_service)
|
||||
{
|
||||
using namespace AICurlPrivate;
|
||||
using namespace AICurlPrivate::curlthread;
|
||||
|
||||
bool reject, equal, increment_threshold, decrement_threshold;
|
||||
// Do certain things at most once every 40ms.
|
||||
U64 const sTime_40ms = get_clock_count() * HTTPTimeout::sClockWidth_40ms; // Time in 40ms units.
|
||||
|
||||
// Cache all sTotalQueued info.
|
||||
bool starvation, decrement_threshold;
|
||||
S32 total_queued_or_added = MultiHandle::total_added_size();
|
||||
{
|
||||
TotalQueued_wat total_queued_w(sTotalQueued);
|
||||
total_queued_or_added += total_queued_w->count;
|
||||
starvation = total_queued_w->starvation;
|
||||
decrement_threshold = total_queued_w->full && !total_queued_w->empty;
|
||||
total_queued_w->empty = total_queued_w->full = false; // Reset flags.
|
||||
}
|
||||
|
||||
// Whether or not we're going to approve a new request, decrement the global threshold first, when appropriate.
|
||||
|
||||
// Atomic read max_pipelined_requests for the below calculations.
|
||||
S32 const max_pipelined_requests_cache = max_pipelined_requests;
|
||||
decrement_threshold = sQueueFull && !sQueueEmpty;
|
||||
// Reset flags.
|
||||
sQueueEmpty = sQueueFull = false;
|
||||
if (decrement_threshold)
|
||||
{
|
||||
if (max_pipelined_requests_cache > (S32)curl_max_total_concurrent_connections)
|
||||
MaxPipelinedRequests_wat max_pipelined_requests_w(sMaxPipelinedRequests);
|
||||
if (max_pipelined_requests_w->count > (S32)curl_max_total_concurrent_connections &&
|
||||
sTime_40ms > max_pipelined_requests_w->last_decrement)
|
||||
{
|
||||
// Decrement the threshold because since the last call to this function at least one curl request finished
|
||||
// and was replaced with another request from the queue, but the queue never ran empty: we have too many
|
||||
// queued requests.
|
||||
--max_pipelined_requests;
|
||||
max_pipelined_requests_w->count--;
|
||||
// Do this at most once every 40 ms.
|
||||
max_pipelined_requests_w->last_decrement = sTime_40ms;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if it's ok to get a new request for this particular service and update the per-service threshold.
|
||||
|
||||
AIAverage* http_bandwidth_ptr;
|
||||
|
||||
bool reject, equal, increment_threshold;
|
||||
{
|
||||
PerServiceRequestQueue_wat per_service_w(*per_service);
|
||||
PerService_wat per_service_w(*per_service);
|
||||
S32 const pipelined_requests_per_service = per_service_w->pipelined_requests();
|
||||
//llassert(pipelined_requests_per_service >= 0 && pipelined_requests_per_service <= 16);
|
||||
reject = pipelined_requests_per_service >= per_service_w->mMaxPipelinedRequests;
|
||||
equal = pipelined_requests_per_service == per_service_w->mMaxPipelinedRequests;
|
||||
increment_threshold = per_service_w->mRequestStarvation;
|
||||
decrement_threshold = per_service_w->mQueueFull && !per_service_w->mQueueEmpty;
|
||||
// Reset flags.
|
||||
per_service_w->mQueueFull = per_service_w->mQueueEmpty = per_service_w->mRequestStarvation = false;
|
||||
// Grab per service bandwidth object.
|
||||
http_bandwidth_ptr = &per_service_w->bandwidth();
|
||||
if (decrement_threshold)
|
||||
{
|
||||
if (per_service_w->mMaxPipelinedRequests > per_service_w->mConcurrectConnections)
|
||||
@@ -2655,106 +2673,121 @@ bool AIPerService::wantsMoreHTTPRequestsFor(AIPerServicePtr const& per_service,
|
||||
reject = !equal;
|
||||
}
|
||||
}
|
||||
if (!reject)
|
||||
{
|
||||
// Before releasing the lock on per_service, stop other threads from getting a
|
||||
// too small value from pipelined_requests() and approving too many requests.
|
||||
per_service_w->mApprovedRequests++;
|
||||
//llassert(per_service_w->mApprovedRequests <= 16);
|
||||
}
|
||||
}
|
||||
if (reject)
|
||||
{
|
||||
// Too many request for this host already.
|
||||
// Too many request for this service already.
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!no_bandwidth_throttling)
|
||||
// Throttle on bandwidth usage.
|
||||
if (checkBandwidthUsage(per_service, sTime_40ms))
|
||||
{
|
||||
// Throttle on bandwidth usage.
|
||||
|
||||
static size_t throttle_fraction = 1024; // A value between 0 and 1024: each service is throttled when it uses more than max_bandwidth * (throttle_fraction/1024) bandwidth.
|
||||
static AIAverage fraction(25); // Average over 25 * 40ms = 1 second.
|
||||
static U64 last_sTime_40ms = 0;
|
||||
|
||||
// Truncate the sums to the last second, and get their value.
|
||||
U64 const sTime_40ms = get_clock_count() * HTTPTimeout::sClockWidth_40ms; // Time in 40ms units.
|
||||
size_t const max_bandwidth = 125.f * max_kbps; // Convert kbps to bytes per second.
|
||||
size_t const total_bandwidth = BufferedCurlEasyRequest::sHTTPBandwidth.truncateData(sTime_40ms); // Bytes received in the past second.
|
||||
size_t const service_bandwidth = http_bandwidth_ptr->truncateData(sTime_40ms); // Idem for just this service.
|
||||
if (sTime_40ms > last_sTime_40ms)
|
||||
{
|
||||
// Only add throttle_fraction once every 40 ms at most.
|
||||
// It's ok to ignore other values in the same 40 ms because the value only changes on the scale of 1 second.
|
||||
fraction.addData(throttle_fraction, sTime_40ms);
|
||||
last_sTime_40ms = sTime_40ms;
|
||||
}
|
||||
double fraction_avg = fraction.getAverage(1024.0); // throttle_fraction averaged over the past second, or 1024 if there is no data.
|
||||
|
||||
// Adjust throttle_fraction based on total bandwidth usage.
|
||||
if (total_bandwidth == 0)
|
||||
throttle_fraction = 1024;
|
||||
else
|
||||
{
|
||||
// This is the main formula. It can be made plausible by assuming
|
||||
// an equilibrium where total_bandwidth == max_bandwidth and
|
||||
// thus throttle_fraction == fraction_avg for more than a second.
|
||||
//
|
||||
// Then, more bandwidth is being used (for example because another
|
||||
// service starts downloading). Assuming that all services that use
|
||||
// a significant portion of the bandwidth, the new service included,
|
||||
// must be throttled (all using the same bandwidth; note that the
|
||||
// new service is immediately throttled at the same value), then
|
||||
// the limit should be reduced linear with the fraction:
|
||||
// max_bandwidth / total_bandwidth.
|
||||
//
|
||||
// For example, let max_bandwidth be 1. Let there be two throttled
|
||||
// services, each using 0.5 (fraction_avg = 1024/2). Lets the new
|
||||
// service use what it can: also 0.5 - then without reduction the
|
||||
// total_bandwidth would become 1.5, and throttle_fraction would
|
||||
// become (1024/2) * 1/1.5 = 1024/3: from 2 to 3 services.
|
||||
//
|
||||
// In reality, total_bandwidth would rise linear from 1.0 to 1.5 in
|
||||
// one second if the throttle fraction wasn't changed. However it is
|
||||
// changed here. The end result is that any change more or less
|
||||
// linear fades away in one second.
|
||||
throttle_fraction = fraction_avg * max_bandwidth / total_bandwidth;
|
||||
}
|
||||
if (throttle_fraction > 1024)
|
||||
throttle_fraction = 1024;
|
||||
if (total_bandwidth > max_bandwidth)
|
||||
{
|
||||
throttle_fraction *= 0.95;
|
||||
}
|
||||
|
||||
// Throttle this service if it uses too much bandwidth.
|
||||
if (service_bandwidth > (max_bandwidth * throttle_fraction / 1024))
|
||||
{
|
||||
return false; // wait
|
||||
}
|
||||
// Too much bandwidth is being used, either in total or for this service.
|
||||
PerService_wat(*per_service)->mApprovedRequests--; // Not approved after all.
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if it's ok to get a new request based on the total number of requests and increment the threshold if appropriate.
|
||||
|
||||
{
|
||||
command_queue_rat command_queue_r(command_queue);
|
||||
S32 const pipelined_requests = command_queue_r->size + sTotalQueued + MultiHandle::total_added_size();
|
||||
// We can't take the command being processed (command_being_processed) into account without
|
||||
// introducing relatively long waiting times for some mutex (namely between when the command
|
||||
// is moved from command_queue to command_being_processed, till it's actually being added to
|
||||
// mAddedEasyRequests). The whole purpose of command_being_processed is to reduce the time
|
||||
// that things are locked to micro seconds, so we'll just accept an off-by-one fuzziness
|
||||
// here instead.
|
||||
S32 const pipelined_requests = command_queue_rat(command_queue)->size + total_queued_or_added;
|
||||
// We can't take the command being processed (command_being_processed) into account without
|
||||
// introducing relatively long waiting times for some mutex (namely between when the command
|
||||
// is moved from command_queue to command_being_processed, till it's actually being added to
|
||||
// mAddedEasyRequests). The whole purpose of command_being_processed is to reduce the time
|
||||
// that things are locked to micro seconds, so we'll just accept an off-by-one fuzziness
|
||||
// here instead.
|
||||
|
||||
// The maximum number of requests that may be queued in command_queue is equal to the total number of requests
|
||||
// that may exist in the pipeline minus the number of requests queued in AIPerService objects, minus
|
||||
// the number of already running requests.
|
||||
reject = pipelined_requests >= max_pipelined_requests_cache;
|
||||
equal = pipelined_requests == max_pipelined_requests_cache;
|
||||
increment_threshold = sRequestStarvation;
|
||||
}
|
||||
// The maximum number of requests that may be queued in command_queue is equal to the total number of requests
|
||||
// that may exist in the pipeline minus the number of requests queued in AIPerService objects, minus
|
||||
// the number of already running requests.
|
||||
MaxPipelinedRequests_wat max_pipelined_requests_w(sMaxPipelinedRequests);
|
||||
reject = pipelined_requests >= max_pipelined_requests_w->count;
|
||||
equal = pipelined_requests == max_pipelined_requests_w->count;
|
||||
increment_threshold = starvation;
|
||||
if (increment_threshold && reject)
|
||||
{
|
||||
if (max_pipelined_requests_cache < 2 * (S32)curl_max_total_concurrent_connections)
|
||||
if (max_pipelined_requests_w->count < 2 * (S32)curl_max_total_concurrent_connections &&
|
||||
sTime_40ms > max_pipelined_requests_w->last_increment)
|
||||
{
|
||||
max_pipelined_requests++;
|
||||
max_pipelined_requests_w->count++;
|
||||
max_pipelined_requests_w->last_increment = sTime_40ms;
|
||||
// Immediately take the new threshold into account.
|
||||
reject = !equal;
|
||||
}
|
||||
}
|
||||
if (reject)
|
||||
{
|
||||
PerService_wat(*per_service)->mApprovedRequests--; // Not approved after all.
|
||||
}
|
||||
return !reject;
|
||||
}
|
||||
|
||||
bool AIPerService::checkBandwidthUsage(AIPerServicePtr const& per_service, U64 sTime_40ms)
|
||||
{
|
||||
if (sNoHTTPBandwidthThrottling)
|
||||
return false;
|
||||
|
||||
using namespace AICurlPrivate;
|
||||
|
||||
// Truncate the sums to the last second, and get their value.
|
||||
size_t const max_bandwidth = AIPerService::getHTTPThrottleBandwidth125();
|
||||
size_t const total_bandwidth = BufferedCurlEasyRequest::sHTTPBandwidth.truncateData(sTime_40ms); // Bytes received in the past second.
|
||||
size_t const service_bandwidth = PerService_wat(*per_service)->bandwidth().truncateData(sTime_40ms); // Idem for just this service.
|
||||
ThrottleFraction_wat throttle_fraction_w(sThrottleFraction);
|
||||
if (sTime_40ms > throttle_fraction_w->last_add)
|
||||
{
|
||||
throttle_fraction_w->average.addData(throttle_fraction_w->fraction, sTime_40ms);
|
||||
// Only add throttle_fraction_w->fraction once every 40 ms at most.
|
||||
// It's ok to ignore other values in the same 40 ms because the value only changes on the scale of 1 second.
|
||||
throttle_fraction_w->last_add = sTime_40ms;
|
||||
}
|
||||
double fraction_avg = throttle_fraction_w->average.getAverage(1024.0); // throttle_fraction_w->fraction averaged over the past second, or 1024 if there is no data.
|
||||
|
||||
// Adjust the fraction based on total bandwidth usage.
|
||||
if (total_bandwidth == 0)
|
||||
throttle_fraction_w->fraction = 1024;
|
||||
else
|
||||
{
|
||||
// This is the main formula. It can be made plausible by assuming
|
||||
// an equilibrium where total_bandwidth == max_bandwidth and
|
||||
// thus fraction == fraction_avg for more than a second.
|
||||
//
|
||||
// Then, more bandwidth is being used (for example because another
|
||||
// service starts downloading). Assuming that all services that use
|
||||
// a significant portion of the bandwidth, the new service included,
|
||||
// must be throttled (all using the same bandwidth; note that the
|
||||
// new service is immediately throttled at the same value), then
|
||||
// the limit should be reduced linear with the fraction:
|
||||
// max_bandwidth / total_bandwidth.
|
||||
//
|
||||
// For example, let max_bandwidth be 1. Let there be two throttled
|
||||
// services, each using 0.5 (fraction_avg = 1024/2). Let the new
|
||||
// service use what it can: also 0.5 - then without reduction the
|
||||
// total_bandwidth would become 1.5, and fraction would
|
||||
// become (1024/2) * 1/1.5 = 1024/3: from 2 to 3 services.
|
||||
//
|
||||
// In reality, total_bandwidth would rise linear from 1.0 to 1.5 in
|
||||
// one second if the throttle fraction wasn't changed. However it is
|
||||
// changed here. The end result is that any change more or less
|
||||
// linear fades away in one second.
|
||||
throttle_fraction_w->fraction = llmin(1024., fraction_avg * max_bandwidth / total_bandwidth + 0.5);
|
||||
}
|
||||
if (total_bandwidth > max_bandwidth)
|
||||
{
|
||||
throttle_fraction_w->fraction *= 0.95;
|
||||
}
|
||||
|
||||
// Throttle this service if it uses too much bandwidth.
|
||||
// Warning: this requires max_bandwidth * 1024 to fit in a size_t.
|
||||
// On 32 bit that means that HTTPThrottleBandwidth must be less than 33554 kbps.
|
||||
return (service_bandwidth > (max_bandwidth * throttle_fraction_w->fraction / 1024));
|
||||
}
|
||||
|
||||
|
||||
@@ -208,7 +208,8 @@ void LLHTTPClient::request(
|
||||
EAllowCompressedReply allow_compression,
|
||||
AIStateMachine* parent,
|
||||
AIStateMachine::state_type new_parent_state,
|
||||
AIEngine* default_engine)
|
||||
AIEngine* default_engine,
|
||||
bool queue_if_too_much_bandwidth_usage)
|
||||
{
|
||||
llassert(responder);
|
||||
|
||||
@@ -221,7 +222,7 @@ void LLHTTPClient::request(
|
||||
LLURLRequest* req;
|
||||
try
|
||||
{
|
||||
req = new LLURLRequest(method, url, body_injector, responder, headers, keepalive, does_auth, allow_compression);
|
||||
req = new LLURLRequest(method, url, body_injector, responder, headers, keepalive, does_auth, allow_compression, queue_if_too_much_bandwidth_usage);
|
||||
#ifdef DEBUG_CURLIO
|
||||
req->mCurlEasyRequest.debug(debug);
|
||||
#endif
|
||||
@@ -701,6 +702,11 @@ void LLHTTPClient::post(std::string const& url, LLSD const& body, ResponderPtr r
|
||||
request(url, HTTP_POST, new LLSDInjector(body), responder, headers/*,*/ DEBUG_CURLIO_PARAM(debug), keepalive, no_does_authentication, allow_compressed_reply, parent, new_parent_state);
|
||||
}
|
||||
|
||||
void LLHTTPClient::post_nb(std::string const& url, LLSD const& body, ResponderPtr responder, AIHTTPHeaders& headers/*,*/ DEBUG_CURLIO_PARAM(EDebugCurl debug), EKeepAlive keepalive, AIStateMachine* parent, AIStateMachine::state_type new_parent_state)
|
||||
{
|
||||
request(url, HTTP_POST, new LLSDInjector(body), responder, headers/*,*/ DEBUG_CURLIO_PARAM(debug), keepalive, no_does_authentication, allow_compressed_reply, parent, new_parent_state, &gMainThreadEngine, false);
|
||||
}
|
||||
|
||||
void LLHTTPClient::postXMLRPC(std::string const& url, XMLRPC_REQUEST xmlrpc_request, ResponderPtr responder, AIHTTPHeaders& headers/*,*/ DEBUG_CURLIO_PARAM(EDebugCurl debug), EKeepAlive keepalive)
|
||||
{
|
||||
request(url, HTTP_POST, new XMLRPCInjector(xmlrpc_request), responder, headers/*,*/ DEBUG_CURLIO_PARAM(debug), keepalive, does_authentication, allow_compressed_reply);
|
||||
|
||||
@@ -433,7 +433,8 @@ public:
|
||||
EAllowCompressedReply allow_compression = allow_compressed_reply,
|
||||
AIStateMachine* parent = NULL,
|
||||
/*AIStateMachine::state_type*/ U32 new_parent_state = 0,
|
||||
AIEngine* default_engine = &gMainThreadEngine);
|
||||
AIEngine* default_engine = &gMainThreadEngine,
|
||||
bool queue_if_too_much_bandwidth_usage = true);
|
||||
|
||||
/** @name non-blocking API */
|
||||
//@{
|
||||
@@ -465,6 +466,10 @@ public:
|
||||
static void post(std::string const& url, LLSD const& body, ResponderPtr responder/*,*/ DEBUG_CURLIO_PARAM(EDebugCurl debug = debug_off), EKeepAlive keepalive = keep_alive, AIStateMachine* parent = NULL, U32 new_parent_state = 0)
|
||||
{ AIHTTPHeaders headers; post(url, body, responder, headers/*,*/ DEBUG_CURLIO_PARAM(debug), keepalive, parent, new_parent_state); }
|
||||
|
||||
static void post_nb(std::string const& url, LLSD const& body, ResponderPtr responder, AIHTTPHeaders& headers/*,*/ DEBUG_CURLIO_PARAM(EDebugCurl debug = debug_off), EKeepAlive keepalive = keep_alive, AIStateMachine* parent = NULL, U32 new_parent_state = 0);
|
||||
static void post_nb(std::string const& url, LLSD const& body, ResponderPtr responder/*,*/ DEBUG_CURLIO_PARAM(EDebugCurl debug = debug_off), EKeepAlive keepalive = keep_alive, AIStateMachine* parent = NULL, U32 new_parent_state = 0)
|
||||
{ AIHTTPHeaders headers; post_nb(url, body, responder, headers/*,*/ DEBUG_CURLIO_PARAM(debug), keepalive, parent, new_parent_state); }
|
||||
|
||||
/** Takes ownership of request and deletes it when sent */
|
||||
static void postXMLRPC(std::string const& url, XMLRPC_REQUEST request, ResponderPtr responder, AIHTTPHeaders& headers/*,*/ DEBUG_CURLIO_PARAM(EDebugCurl debug = debug_off), EKeepAlive keepalive = keep_alive);
|
||||
static void postXMLRPC(std::string const& url, XMLRPC_REQUEST request, ResponderPtr responder/*,*/ DEBUG_CURLIO_PARAM(EDebugCurl debug = debug_off), EKeepAlive keepalive = keep_alive)
|
||||
|
||||
@@ -75,10 +75,15 @@ std::string LLURLRequest::actionAsVerb(LLURLRequest::ERequestAction action)
|
||||
|
||||
// This might throw AICurlNoEasyHandle.
|
||||
LLURLRequest::LLURLRequest(LLURLRequest::ERequestAction action, std::string const& url, Injector* body,
|
||||
LLHTTPClient::ResponderPtr responder, AIHTTPHeaders& headers, bool keepalive, bool is_auth, bool compression) :
|
||||
LLHTTPClient::ResponderPtr responder, AIHTTPHeaders& headers, bool keepalive, bool is_auth, bool compression,
|
||||
bool queue_if_too_much_bandwidth_usage) :
|
||||
mAction(action), mURL(url), mKeepAlive(keepalive), mIsAuth(is_auth), mNoCompression(!compression),
|
||||
mBody(body), mResponder(responder), mHeaders(headers), mResponderNameCache(responder ? responder->getName() : "<uninitialized>")
|
||||
{
|
||||
if (queue_if_too_much_bandwidth_usage)
|
||||
{
|
||||
AICurlEasyRequest_wat(*mCurlEasyRequest)->queue_if_too_much_bandwidth_usage();
|
||||
}
|
||||
}
|
||||
|
||||
void LLURLRequest::initialize_impl(void)
|
||||
|
||||
@@ -64,7 +64,9 @@ class LLURLRequest : public AICurlEasyRequestStateMachine {
|
||||
* @param action One of the ERequestAction enumerations.
|
||||
* @param url The url of the request. It should already be encoded.
|
||||
*/
|
||||
LLURLRequest(ERequestAction action, std::string const& url, Injector* body, LLHTTPClient::ResponderPtr responder, AIHTTPHeaders& headers, bool keepalive, bool is_auth, bool no_compression);
|
||||
LLURLRequest(ERequestAction action, std::string const& url, Injector* body,
|
||||
LLHTTPClient::ResponderPtr responder, AIHTTPHeaders& headers,
|
||||
bool keepalive, bool is_auth, bool no_compression, bool queue_if_too_much_bandwidth_usage);
|
||||
|
||||
/**
|
||||
* @brief Cached value of responder->getName() as passed to the constructor.
|
||||
|
||||
@@ -175,7 +175,10 @@
|
||||
<key>HTTPThrottleBandwidth</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>The bandwidth (in kbit/s) to strive for</string>
|
||||
<string>The bandwidth (in kbit/s) to strive for. Smaller values might reduce network
|
||||
congestion (sim ping time, aka avatar responsiveness). Higher values might download
|
||||
textures and the inventory faster, although in some cases a too high value might
|
||||
actually slow that down due to serverside throttling. If unsure, choose 2000.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
@@ -4468,7 +4471,7 @@ This should be as low as possible, but too low may break functionality</string>
|
||||
<key>Type</key>
|
||||
<string>U32</string>
|
||||
<key>Value</key>
|
||||
<integer>16</integer>
|
||||
<integer>8</integer>
|
||||
</map>
|
||||
<key>CurlTimeoutDNSLookup</key>
|
||||
<map>
|
||||
|
||||
@@ -189,6 +189,7 @@ LLFloaterCustomize::~LLFloaterCustomize()
|
||||
BOOL LLFloaterCustomize::postBuild()
|
||||
{
|
||||
getChild<LLUICtrl>("Make Outfit")->setCommitCallback(boost::bind(&LLFloaterCustomize::onBtnMakeOutfit, this));
|
||||
getChild<LLUICtrl>("Save Outfit")->setCommitCallback(boost::bind(&LLAppearanceMgr::updateBaseOutfit, LLAppearanceMgr::getInstance()));
|
||||
getChild<LLUICtrl>("Ok")->setCommitCallback(boost::bind(&LLFloaterCustomize::onBtnOk, this));
|
||||
getChild<LLUICtrl>("Cancel")->setCommitCallback(boost::bind(&LLFloater::onClickClose, this));
|
||||
|
||||
|
||||
@@ -31,11 +31,14 @@
|
||||
*/
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llagentwearables.h"
|
||||
#include "llappearancemgr.h"
|
||||
#include "llfoldervieweventlistener.h"
|
||||
#include "llimview.h"
|
||||
#include "llinventoryfunctions.h"
|
||||
#include "llinventorybridge.h"
|
||||
#include "llinventoryclipboard.h"
|
||||
#include "llinventoryfunctions.h"
|
||||
#include "llinventorymodelbackgroundfetch.h"
|
||||
#include "llinventorypanel.h"
|
||||
#include "llmakeoutfitdialog.h"
|
||||
@@ -43,7 +46,6 @@
|
||||
#include "llpanelmaininventory.h"
|
||||
#include "llpanelobjectinventory.h"
|
||||
#include "llpreview.h" // For LLMultiPreview
|
||||
#include "llfoldervieweventlistener.h"
|
||||
#include "lltrans.h"
|
||||
#include "llvoavatarself.h"
|
||||
|
||||
@@ -317,7 +319,7 @@ void do_create(LLInventoryModel *model, LLInventoryPanel *ptr, std::string type,
|
||||
LLInventoryType::IT_GESTURE,
|
||||
PERM_ALL);
|
||||
}
|
||||
else if ("outfit" == type)
|
||||
else if ("outfit" == type || ("update outfit" == type && !LLAppearanceMgr::getInstance()->updateBaseOutfit())) // If updateBaseOutfit fails, prompt to make a new outfit
|
||||
{
|
||||
new LLMakeOutfitDialog(false);
|
||||
return;
|
||||
|
||||
@@ -600,12 +600,14 @@ void LLInventoryModelBackgroundFetch::bulkFetch()
|
||||
LLViewerRegion* region = gAgent.getRegion();
|
||||
if (gDisconnected || !region) return;
|
||||
|
||||
static LLCachedControl<F32> const throttle_bandwidth("HTTPThrottleBandwidth", 2000);
|
||||
bool const no_bandwidth_throttling = gHippoGridManager->getConnectedGrid()->isAvination();
|
||||
if (!AIPerService::wantsMoreHTTPRequestsFor(mPerServicePtr, throttle_bandwidth, no_bandwidth_throttling))
|
||||
if (!AIPerService::wantsMoreHTTPRequestsFor(mPerServicePtr))
|
||||
{
|
||||
return; // Wait.
|
||||
}
|
||||
// If AIPerService::wantsMoreHTTPRequestsFor returns true, then it approved ONE request.
|
||||
// The code below might fire off zero, one or even more than one requests however!
|
||||
// This object keeps track of that.
|
||||
AIPerService::Approvement approvement(mPerServicePtr);
|
||||
|
||||
U32 item_count=0;
|
||||
U32 folder_count=0;
|
||||
@@ -699,14 +701,16 @@ void LLInventoryModelBackgroundFetch::bulkFetch()
|
||||
if (folder_request_body["folders"].size())
|
||||
{
|
||||
LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(folder_request_body, recursive_cats);
|
||||
LLHTTPClient::post(url, folder_request_body, fetcher);
|
||||
LLHTTPClient::post_nb(url, folder_request_body, fetcher);
|
||||
approvement.honored();
|
||||
}
|
||||
if (folder_request_body_lib["folders"].size())
|
||||
{
|
||||
std::string url_lib = gAgent.getRegion()->getCapability("FetchLibDescendents2");
|
||||
|
||||
LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(folder_request_body_lib, recursive_cats);
|
||||
LLHTTPClient::post(url_lib, folder_request_body_lib, fetcher);
|
||||
LLHTTPClient::post_nb(url_lib, folder_request_body_lib, fetcher);
|
||||
approvement.honored();
|
||||
}
|
||||
}
|
||||
if (item_count)
|
||||
@@ -724,7 +728,8 @@ void LLInventoryModelBackgroundFetch::bulkFetch()
|
||||
body["agent_id"] = gAgent.getID();
|
||||
body["items"] = item_request_body;
|
||||
|
||||
LLHTTPClient::post(url, body, new LLInventoryModelFetchItemResponder(body));
|
||||
LLHTTPClient::post_nb(url, body, new LLInventoryModelFetchItemResponder(body));
|
||||
approvement.honored();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -740,13 +745,13 @@ void LLInventoryModelBackgroundFetch::bulkFetch()
|
||||
body["agent_id"] = gAgent.getID();
|
||||
body["items"] = item_request_body_lib;
|
||||
|
||||
LLHTTPClient::post(url, body, new LLInventoryModelFetchItemResponder(body));
|
||||
LLHTTPClient::post_nb(url, body, new LLInventoryModelFetchItemResponder(body));
|
||||
approvement.honored();
|
||||
}
|
||||
}
|
||||
}
|
||||
mFetchTimer.reset();
|
||||
}
|
||||
|
||||
else if (isBulkFetchProcessingComplete())
|
||||
{
|
||||
llinfos << "Inventory fetch completed" << llendl;
|
||||
|
||||
@@ -2509,7 +2509,7 @@ void LLMeshRepository::notifyMeshUnavailable(const LLVolumeParams& mesh_params,
|
||||
}
|
||||
|
||||
S32 LLMeshRepository::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
|
||||
{
|
||||
{
|
||||
return mThread->getActualMeshLOD(mesh_params, lod);
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#include "lluuid.h"
|
||||
#include "llviewertexture.h"
|
||||
#include "llvolume.h"
|
||||
#include "sguuidhash.h"
|
||||
|
||||
#define LLCONVEXDECOMPINTER_STATIC 1
|
||||
|
||||
@@ -505,8 +506,8 @@ public:
|
||||
|
||||
typedef std::map<LLVolumeParams, std::set<LLUUID> > mesh_load_map;
|
||||
mesh_load_map mLoadingMeshes[4];
|
||||
|
||||
typedef std::map<LLUUID, LLMeshSkinInfo> skin_map;
|
||||
|
||||
typedef boost::unordered_map<LLUUID, LLMeshSkinInfo> skin_map;
|
||||
skin_map mSkinMap;
|
||||
|
||||
typedef std::map<LLUUID, LLModel::Decomposition*> decomposition_map;
|
||||
|
||||
@@ -491,7 +491,7 @@ void LLPanelFace::sendTextureInfo()
|
||||
return (object->mDrawable) ? object->mDrawable->getFace(te): NULL;
|
||||
}
|
||||
} get_last_face_func;
|
||||
LLFace* last_face;
|
||||
LLFace* last_face(NULL);
|
||||
LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&get_last_face_func, last_face);
|
||||
|
||||
LLPanelFaceSetAlignedTEFunctor setfunc(this, last_face);
|
||||
@@ -654,7 +654,7 @@ void LLPanelFace::getState()
|
||||
return (object->mDrawable) ? object->mDrawable->getFace(te): NULL;
|
||||
}
|
||||
} get_te_face_func;
|
||||
LLFace* last_face;
|
||||
LLFace* last_face(NULL);
|
||||
LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&get_te_face_func, last_face);
|
||||
LLPanelFaceGetIsAlignedTEFunctor get_is_aligend_func(last_face);
|
||||
// this will determine if the texture param controls are tentative:
|
||||
|
||||
@@ -1008,6 +1008,8 @@ bool idle_startup()
|
||||
LLTrans::setDefaultArg("[GRID_OWNER]", gHippoGridManager->getConnectedGrid()->getGridOwner());
|
||||
LLScriptEdCore::parseFunctions("lsl_functions_os.xml"); //Singu Note: This appends to the base functions parsed from lsl_functions_sl.xml
|
||||
}
|
||||
// Avination doesn't want the viewer to do bandwidth throttling (it is done serverside, taking UDP into account too).
|
||||
AIPerService::setNoHTTPBandwidthThrottling(gHippoGridManager->getConnectedGrid()->isAvination());
|
||||
|
||||
// create necessary directories
|
||||
// *FIX: these mkdir's should error check
|
||||
|
||||
@@ -1272,12 +1272,13 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
||||
}
|
||||
|
||||
// Let AICurl decide if we can process more HTTP requests at the moment or not.
|
||||
static const LLCachedControl<F32> throttle_bandwidth("HTTPThrottleBandwidth", 2000);
|
||||
bool const no_bandwidth_throttling = gHippoGridManager->getConnectedGrid()->isAvination();
|
||||
if (!AIPerService::wantsMoreHTTPRequestsFor(mPerServicePtr, throttle_bandwidth, no_bandwidth_throttling))
|
||||
if (!AIPerService::wantsMoreHTTPRequestsFor(mPerServicePtr))
|
||||
{
|
||||
return false ; //wait.
|
||||
}
|
||||
// If AIPerService::wantsMoreHTTPRequestsFor returns true then it approved ONE request.
|
||||
// This object keeps track of whether or not that is honored.
|
||||
AIPerService::Approvement approvement(mPerServicePtr);
|
||||
|
||||
mFetcher->removeFromNetworkQueue(this, false);
|
||||
|
||||
@@ -1323,7 +1324,9 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
||||
}
|
||||
LLHTTPClient::request(mUrl, LLHTTPClient::HTTP_GET, NULL,
|
||||
new HTTPGetResponder(mFetcher, mID, LLTimer::getTotalTime(), mRequestedSize, mRequestedOffset, true),
|
||||
headers/*,*/ DEBUG_CURLIO_PARAM(debug_off), keep_alive, no_does_authentication, allow_compressed_reply, NULL, 0, NULL);
|
||||
headers/*,*/ DEBUG_CURLIO_PARAM(debug_off), keep_alive, no_does_authentication, allow_compressed_reply, NULL, 0, NULL, false);
|
||||
// Now the request was added to the command queue.
|
||||
approvement.honored();
|
||||
res = true;
|
||||
}
|
||||
if (!res)
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
#include "llimageworker.h"
|
||||
#include "llrender.h"
|
||||
|
||||
#include "aicurlperservice.h"
|
||||
#include "llappviewer.h"
|
||||
#include "llselectmgr.h"
|
||||
#include "llviewertexlayer.h"
|
||||
@@ -621,18 +622,15 @@ void LLGLTexMemBar::draw()
|
||||
text_color, LLFontGL::LEFT, LLFontGL::TOP);
|
||||
|
||||
left += LLFontGL::getFontMonospace()->getWidth(text);
|
||||
// This bandwidth is averaged over 1 seconds (in kbps).
|
||||
F32 bandwidth = AICurlInterface::getHTTPBandwidth() / 125.f; // Convert from bytes/s to kbps.
|
||||
// This is the maximum bandwidth allowed for curl transactions (of any type and averaged per second),
|
||||
// that is actually used to limit the number of HTTP texture requests (and only those).
|
||||
// Comparing that with 'bandwidth' is a bit like comparing apples and oranges, but again... who really cares.
|
||||
static const LLCachedControl<F32> max_bandwidth("HTTPThrottleBandwidth", 2000);
|
||||
color = bandwidth > max_bandwidth ? LLColor4::red : bandwidth > max_bandwidth*.75f ? LLColor4::yellow : text_color;
|
||||
// This bandwidth is averaged over 1 seconds (in bytes/s).
|
||||
size_t const bandwidth = AICurlInterface::getHTTPBandwidth();
|
||||
size_t const max_bandwidth = AIPerService::getHTTPThrottleBandwidth125();
|
||||
color = (bandwidth > max_bandwidth) ? LLColor4::red : ((bandwidth > max_bandwidth * .75f) ? LLColor4::yellow : text_color);
|
||||
color[VALPHA] = text_color[VALPHA];
|
||||
text = llformat("BW:%.0f/%.0f", bandwidth, max_bandwidth.get());
|
||||
text = llformat("BW:%lu/%lu", bandwidth / 125, max_bandwidth / 125);
|
||||
LLFontGL::getFontMonospace()->renderUTF8(text, 0, left, v_offset + line_height*2,
|
||||
color, LLFontGL::LEFT, LLFontGL::TOP);
|
||||
|
||||
|
||||
S32 dx1 = 0;
|
||||
if (LLAppViewer::getTextureFetch()->mDebugPause)
|
||||
{
|
||||
|
||||
@@ -84,7 +84,6 @@
|
||||
#include "aicurl.h"
|
||||
#include "aihttptimeoutpolicy.h"
|
||||
|
||||
|
||||
#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
|
||||
BOOL gHackGodmode = FALSE;
|
||||
#endif
|
||||
@@ -330,6 +329,12 @@ static bool handleBandwidthChanged(const LLSD& newvalue)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool handleHTTPBandwidthChanged(const LLSD& newvalue)
|
||||
{
|
||||
AIPerService::setHTTPThrottleBandwidth((F32) newvalue.asReal());
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool handleChatFontSizeChanged(const LLSD& newvalue)
|
||||
{
|
||||
if(gConsole)
|
||||
@@ -666,6 +671,7 @@ void settings_setup_listeners()
|
||||
gSavedSettings.getControl("RenderTreeLODFactor")->getSignal()->connect(boost::bind(&handleTreeLODChanged, _2));
|
||||
gSavedSettings.getControl("RenderFlexTimeFactor")->getSignal()->connect(boost::bind(&handleFlexLODChanged, _2));
|
||||
gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&handleBandwidthChanged, _2));
|
||||
gSavedSettings.getControl("HTTPThrottleBandwidth")->getSignal()->connect(boost::bind(&handleHTTPBandwidthChanged, _2));
|
||||
gSavedSettings.getControl("RenderGamma")->getSignal()->connect(boost::bind(&handleGammaChanged, _2));
|
||||
gSavedSettings.getControl("RenderFogRatio")->getSignal()->connect(boost::bind(&handleFogRatioChanged, _2));
|
||||
gSavedSettings.getControl("RenderMaxPartCount")->getSignal()->connect(boost::bind(&handleMaxPartCountChanged, _2));
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
// common includes
|
||||
#include "llstat.h"
|
||||
#include "llstring.h"
|
||||
#include "sguuidhash.h"
|
||||
|
||||
// project includes
|
||||
#include "llviewerobject.h"
|
||||
@@ -216,8 +217,8 @@ public:
|
||||
|
||||
std::set<LLUUID> mDeadObjects;
|
||||
|
||||
std::map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap;
|
||||
std::map<LLUUID, LLPointer<LLVOAvatar> > mUUIDAvatarMap;
|
||||
boost::unordered_map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap;
|
||||
boost::unordered_map<LLUUID, LLPointer<LLVOAvatar> > mUUIDAvatarMap;
|
||||
|
||||
//set of objects that need to update their cost
|
||||
std::set<LLUUID> mStaleObjectCost;
|
||||
@@ -269,7 +270,7 @@ extern LLViewerObjectList gObjectList;
|
||||
// Inlines
|
||||
inline LLViewerObject *LLViewerObjectList::findObject(const LLUUID &id) const
|
||||
{
|
||||
std::map<LLUUID, LLPointer<LLViewerObject> >::const_iterator iter = mUUIDObjectMap.find(id);
|
||||
boost::unordered_map<LLUUID, LLPointer<LLViewerObject> >::const_iterator iter = mUUIDObjectMap.find(id);
|
||||
if(iter != mUUIDObjectMap.end())
|
||||
{
|
||||
return iter->second;
|
||||
@@ -282,7 +283,7 @@ inline LLViewerObject *LLViewerObjectList::findObject(const LLUUID &id) const
|
||||
|
||||
inline LLVOAvatar *LLViewerObjectList::findAvatar(const LLUUID &id) const
|
||||
{
|
||||
std::map<LLUUID, LLPointer<LLVOAvatar> >::const_iterator iter = mUUIDAvatarMap.find(id);
|
||||
boost::unordered_map<LLUUID, LLPointer<LLVOAvatar> >::const_iterator iter = mUUIDAvatarMap.find(id);
|
||||
return (iter != mUUIDAvatarMap.end()) ? iter->second.get() : NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -104,7 +104,6 @@
|
||||
#include "llsys.h"
|
||||
#include "llthread.h"
|
||||
#include "lltimer.h"
|
||||
#include "lluuidhashmap.h"
|
||||
//#include "processor.h"
|
||||
#include "stdenums.h"
|
||||
#include "stdtypes.h"
|
||||
|
||||
@@ -1597,8 +1597,9 @@ void LLViewerRegion::unpackRegionHandshake()
|
||||
// all of our terrain stuff, by
|
||||
if (compp->getParamsReady())
|
||||
{
|
||||
//this line creates frame stalls on region crossing and removing it appears to have no effect
|
||||
//getLand().dirtyAllPatches();
|
||||
// The following line was commented out in http://hg.secondlife.com/viewer-development/commits/448b02f5b56f9e608952c810df5454f83051a992
|
||||
// by davep. However, this is needed to see changes in region/estate texture elevation ranges, and to update the terrain textures after terraforming.
|
||||
getLand().dirtyAllPatches();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -1449,4 +1449,5 @@ one from scratch and wear it.
|
||||
height="20" label="Make Outfit..." label_selected="Make Outfit..."
|
||||
mouse_opaque="true" name="Make Outfit" left="10" scale_image="true"
|
||||
width="100" />
|
||||
<button bottom="-536" follows="left|bottom" height="20" left="110" width="100" name="Save Outfit" label="Save Outfit"/>
|
||||
</floater>
|
||||
|
||||
@@ -72,6 +72,9 @@
|
||||
name="Open" width="128">
|
||||
<on_click filter="" function="Inventory.DoToSelected" userdata="open" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Update Outfit" mouse_opaque="true" name="Update Outfit">
|
||||
<on_click filter="" function="Inventory.DoCreate" userdata="update outfit"/>
|
||||
</menu_item_call>
|
||||
<menu_item_separator bottom_delta="-8" height="8" left="0" mouse_opaque="true" name="separator"
|
||||
width="128" />
|
||||
<menu_item_call bottom_delta="-18" height="18" label="New Window" left="0" mouse_opaque="true"
|
||||
@@ -122,7 +125,7 @@
|
||||
name="New Gesture" width="121">
|
||||
<on_click filter="" function="Inventory.DoCreate" userdata="gesture" />
|
||||
</menu_item_call>
|
||||
<menu bottom_delta="-689" drop_shadow="true" height="175" left="0"
|
||||
<menu bottom_delta="-689" drop_shadow="true" height="175" left="0" label="New Clothes"
|
||||
mouse_opaque="false" name="New Clothes" opaque="true" width="125">
|
||||
<menu_item_call bottom_delta="-18" height="18" label="New Shirt" left="0" mouse_opaque="true"
|
||||
name="New Shirt" width="125">
|
||||
@@ -173,7 +176,7 @@
|
||||
<on_click filter="" function="Inventory.DoCreate" userdata="physics" />
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
<menu bottom_delta="-599" drop_shadow="true" height="85" left="0"
|
||||
<menu bottom_delta="-599" drop_shadow="true" height="85" left="0" label="New Body Parts"
|
||||
mouse_opaque="false" name="New Body Parts" opaque="true" width="118">
|
||||
<menu_item_call bottom_delta="-18" height="18" label="New Shape" left="0" mouse_opaque="true"
|
||||
name="New Shape" width="118">
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<string name="character_owner_loading">[Loading]</string>
|
||||
<string name="character_owner_unknown">[Unknown]</string>
|
||||
<string name="character_owner_group">[group]</string>
|
||||
<panel
|
||||
<panel name="pathfinding_chars_main"
|
||||
border="false"
|
||||
bevel_style="none"
|
||||
follows="left|top|right|bottom"
|
||||
@@ -126,7 +126,7 @@
|
||||
left="18"
|
||||
bottom_delta="10"
|
||||
width="600"/>
|
||||
<panel
|
||||
<panel name="pathfinding_chars_actions"
|
||||
border="false"
|
||||
bevel_style="none"
|
||||
follows="left|right|bottom"
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
<string name="linkset_is_non_volume_state">[concave]</string>
|
||||
<string name="linkset_is_restricted_non_volume_state">[restricted,concave]</string>
|
||||
<string name="linkset_choose_use">Choose linkset use...</string>
|
||||
<panel
|
||||
<panel name="pathfinding_linksets_main"
|
||||
bottom="160"
|
||||
border="false"
|
||||
bevel_style="none"
|
||||
@@ -51,7 +51,7 @@
|
||||
height="226"
|
||||
mouse_opaque="false"
|
||||
width="1059">
|
||||
<text
|
||||
<text name="linksets_filter_label"
|
||||
height="13"
|
||||
word_wrap="false"
|
||||
use_ellipses="false"
|
||||
@@ -65,7 +65,7 @@
|
||||
width="67">
|
||||
Filter by:
|
||||
</text>
|
||||
<text
|
||||
<text name="linksets_name_label"
|
||||
height="13"
|
||||
word_wrap="false"
|
||||
use_ellipses="false"
|
||||
@@ -91,7 +91,7 @@
|
||||
name="filter_by_name"
|
||||
bottom_delta="-5"
|
||||
width="161" />
|
||||
<text
|
||||
<text name="linksets_desc_label"
|
||||
height="13"
|
||||
word_wrap="false"
|
||||
use_ellipses="false"
|
||||
@@ -297,7 +297,7 @@
|
||||
top_pad="0"
|
||||
left="18"
|
||||
width="1039"/>
|
||||
<panel
|
||||
<panel name="pathfinding_linksets_actions"
|
||||
border="false"
|
||||
bevel_style="none"
|
||||
follows="left|right|bottom"
|
||||
@@ -306,7 +306,7 @@
|
||||
height="67"
|
||||
mouse_opaque="false"
|
||||
width="1010">
|
||||
<text
|
||||
<text name="linksets_actions_label"
|
||||
height="13"
|
||||
word_wrap="false"
|
||||
use_ellipses="false"
|
||||
@@ -391,7 +391,7 @@
|
||||
top_pad="0"
|
||||
left="18"
|
||||
width="1039"/>
|
||||
<panel
|
||||
<panel name="pathfinding_linksets_attributes"
|
||||
border="false"
|
||||
bevel_style="none"
|
||||
follows="left|right|bottom"
|
||||
@@ -400,7 +400,7 @@
|
||||
height="75"
|
||||
mouse_opaque="false"
|
||||
width="1010">
|
||||
<text
|
||||
<text name="linksets_attributes_label"
|
||||
height="13"
|
||||
word_wrap="false"
|
||||
use_ellipses="false"
|
||||
|
||||
@@ -49,6 +49,10 @@
|
||||
<on_click function="Object.ScriptCount" />
|
||||
<on_visible function="Object.VisibleScriptCount" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Script Info" mouse_opaque="true" name="Script Info">
|
||||
<on_click function="ShowFloater" userdata="script info" />
|
||||
<on_visible function="Self.VisibleScriptInfo" />
|
||||
</menu_item_call>
|
||||
</pie_menu>
|
||||
<menu_item_call enabled="true" label="Inspect" mouse_opaque="true" name="Object Inspect">
|
||||
<on_click function="Object.Inspect" />
|
||||
|
||||
@@ -49,10 +49,10 @@
|
||||
En venta a: [BUYER]
|
||||
</text>
|
||||
<text name="Sell with landowners objects in parcel.">
|
||||
Los objetos se incluyen en la venta.
|
||||
Objetos incluidos en la venta.
|
||||
</text>
|
||||
<text name="Selling with no objects in parcel.">
|
||||
Los objetos no se incluyen en la venta.
|
||||
Objetos NO incluidos en la venta.
|
||||
</text>
|
||||
<button label="Cancelar la venta del terreno" label_selected="Cancelar la venta del terreno" name="Cancel Land Sale"/>
|
||||
<text name="Claimed:">
|
||||
@@ -74,6 +74,7 @@
|
||||
0
|
||||
</text>
|
||||
<button label="Comprar terreno..." label_selected="Comprar terreno..." name="Buy Land..." width="120"/>
|
||||
<button name="Scripts..." label="Info de Scripts"/>
|
||||
<button label="Comprar para el grupo..." label_selected="Comprar para el grupo..." name="Buy For Group..." width="160" left="280"/>
|
||||
<button label="Comprar un Pase..." label_selected="Comprar un Pase..." name="Buy Pass..." tool_tip="Un pase te da acceso temporario a este terreno." width="120"/>
|
||||
<button label="Abandonar terreno..." label_selected="Abandonar terreno..." name="Abandon Land..." width="160" left="280"/>
|
||||
@@ -414,7 +415,7 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
|
||||
<text name="allow_label5">
|
||||
Permitir a residentes en otras parcelas:
|
||||
</text>
|
||||
<check_box label="Ver Avatares" name="SeeAvatarsCheck" tool_tip="Premite a los residentes en otras parcelas ver y conversar con los residentes en esta parcela, y tu prodrás verlos y conversar también con ellos."/>
|
||||
<check_box label="Ver Avatares" name="SeeAvatarsCheck" tool_tip="Permite a los residentes en otras parcelas ver y conversar con los residentes en esta parcela, y tu prodrás verlos y conversar también con ellos."/>
|
||||
<text name="Snapshot:">
|
||||
Foto:
|
||||
</text>
|
||||
@@ -479,7 +480,7 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
|
||||
<texture_picker label="" name="media texture" tool_tip="Pulsa aquí para elegir una textura"/>
|
||||
<text name="replace_texture_help">
|
||||
Los objetos que usen esta textura mostrarán la
|
||||
película o la web cuando pulse la flecha de ejecución.
|
||||
película o la web al pulsar la flecha de ejecución.
|
||||
|
||||
Selecciona la miniatura para elegir una textura diferente.
|
||||
</text>
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="floater_asset_text_editor" title="Editor de Textos">
|
||||
<text name="status_text">
|
||||
Cargando...
|
||||
</text>
|
||||
<button name="upload_btn" label="[UPLOAD]"/>
|
||||
<button name="save_btn" label="Grabar"/>
|
||||
<simple_text_editor name="text_editor" />
|
||||
</floater>
|
||||
@@ -60,33 +60,42 @@
|
||||
<string name="ControlYourCamera">
|
||||
Controlar tu cámara
|
||||
</string>
|
||||
<string name="OverrideAnimations">
|
||||
Reemplazar tus animaciones predeterminadas
|
||||
</string>
|
||||
<layout_stack name="panels">
|
||||
<layout_panel name="im_contents_panel">
|
||||
<combo_box label="Gestos" name="Gesture">
|
||||
<combo_item name="Gestures">
|
||||
Gestos
|
||||
</combo_item>
|
||||
</combo_box>
|
||||
<check_box label="Mostrar Texto Ignorado" name="show mutes"/>
|
||||
<button label="Abrir Historial" name="chat_history_open" tool_tip="Pulsá aquí para abrir el historial de chat en un editor externo." left_delta="150"/>
|
||||
<button label="< <" label_selected="> >" name="toggle_active_speakers_btn" tool_tip="Pulsa aqui para ver la lista de los participantes en esta sesión de MI"/>
|
||||
<panel name="chat_panel">
|
||||
<string name="gesture_label">
|
||||
Gestos
|
||||
</string>
|
||||
<line_editor label="Pulsa aquí para escribir en el chat." name="Chat Editor"/>
|
||||
<flyout_button label="Decir" name="Say" tool_tip="(Intro)" left="-62" width="68">
|
||||
<flyout_button_item name="shout_item">
|
||||
Gritar
|
||||
</flyout_button_item>
|
||||
<flyout_button_item name="say_item">
|
||||
Decir
|
||||
</flyout_button_item>
|
||||
<flyout_button_item name="whisper_item">
|
||||
Susurrar
|
||||
</flyout_button_item>
|
||||
</flyout_button>
|
||||
</panel>
|
||||
</layout_panel>
|
||||
<layout_stack name="im_contents_stack">
|
||||
<layout_panel name="history_panel">
|
||||
<combo_box label="Gestos" name="Gesture">
|
||||
<combo_item name="Gestures">
|
||||
Gestos
|
||||
</combo_item>
|
||||
</combo_box>
|
||||
<check_box label="Mostrar Texto Ignorado" name="show mutes"/>
|
||||
<button label="Abrir Historial" name="chat_history_open" tool_tip="Pulsá aquí para abrir el historial de chat en un editor externo." left_delta="150"/>
|
||||
<button label="< <" label_selected="> >" name="toggle_active_speakers_btn" tool_tip="Pulsa aqui para ver la lista de los participantes en esta sesión de MI"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="chat_layout_panel">
|
||||
<panel name="chat_panel">
|
||||
<string name="gesture_label">
|
||||
Gestos
|
||||
</string>
|
||||
<line_editor label="Pulsa aquí para escribir en el chat." name="Chat Editor"/>
|
||||
<flyout_button label="Decir" name="Say" tool_tip="(Intro)" left="-62" width="68">
|
||||
<flyout_button_item name="shout_item">
|
||||
Gritar
|
||||
</flyout_button_item>
|
||||
<flyout_button_item name="say_item">
|
||||
Decir
|
||||
</flyout_button_item>
|
||||
<flyout_button_item name="whisper_item">
|
||||
Susurrar
|
||||
</flyout_button_item>
|
||||
</flyout_button>
|
||||
</panel>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
</floater>
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="directory" title="Buscar en Second Life">
|
||||
<tab_container name="Directory Tabs">
|
||||
<panel label="Todo" name="find_all_panel">
|
||||
<!-- ======================== -->
|
||||
<panel label="Todos" name="find_all_panel">
|
||||
<string name="searching_text">
|
||||
Buscando...
|
||||
</string>
|
||||
@@ -36,6 +37,7 @@
|
||||
<check_box label="Contenido PG" name="incpg"/>
|
||||
<check_box label="Contenido Mature" name="incmature"/>
|
||||
<check_box label="Contenido Adulto" name="incadult"/>
|
||||
<check_box name="filter_gaming" label="Ocultar Juegos de azar" />
|
||||
<button label="?" label_selected="?" name="?"/>
|
||||
<string name="loading_text">
|
||||
Cargando...
|
||||
@@ -50,6 +52,7 @@
|
||||
http://secondlife.com/app/search/index.php?
|
||||
</string>
|
||||
</panel>
|
||||
<!-- ======================== -->
|
||||
<panel label="Clasificados" name="classified_panel">
|
||||
<string name="searching_text">
|
||||
Buscando...
|
||||
@@ -64,6 +67,7 @@
|
||||
<check_box label="Contenido PG" name="incpg"/>
|
||||
<check_box label="Contenido Mature" name="incmature"/>
|
||||
<check_box label="Contenido Adulto" name="incadult"/>
|
||||
<check_box name="filter_gaming" label="Ocultar Juegos de azar" />
|
||||
<combo_box name="Category">
|
||||
<combo_item name="AnyCategory">
|
||||
Cualquier Categoría
|
||||
@@ -107,6 +111,7 @@
|
||||
<button label="Siguiente >" label_selected="Siguiente >" name="Next >"/>
|
||||
<button label="< Anterior" label_selected="< Anterior" name="< Prev"/>
|
||||
</panel>
|
||||
<!-- ======================== -->
|
||||
<panel label="Eventos" name="events_panel">
|
||||
<string name="searching_text">
|
||||
Buscando...
|
||||
@@ -117,7 +122,6 @@
|
||||
<text name="text2">
|
||||
Buscar:
|
||||
</text>
|
||||
<line_editor name="event_search_text"/>
|
||||
<radio_group name="date_mode">
|
||||
<radio_item name="current">
|
||||
En curso y próximos
|
||||
@@ -176,6 +180,7 @@
|
||||
<check_box label="Contenido PG" name="incpg"/>
|
||||
<check_box label="Contenido Mature" name="incmature"/>
|
||||
<check_box label="Contenido Adulto" name="incadult"/>
|
||||
<check_box name="filter_gaming" label="Ocultar Juegos de Azar"/>
|
||||
<button label="Buscar" label_selected="Buscar" name="Search"/>
|
||||
<button label="Borrar" label_selected="Borrar" name="Delete"/>
|
||||
<scroll_list name="results">
|
||||
@@ -186,6 +191,7 @@
|
||||
<button label="Siguiente >" label_selected="Siguiente >" name="Next >"/>
|
||||
<button label="< Anterior" label_selected="< Anterior" name="< Prev"/>
|
||||
</panel>
|
||||
<!-- ======================== -->
|
||||
<panel label="Escaparate" name="showcase_panel">
|
||||
<string name="searching_text">
|
||||
Buscando...
|
||||
@@ -195,6 +201,8 @@
|
||||
</string>
|
||||
<button label="" name="back_btn"/>
|
||||
<button label="" name="forward_btn"/>
|
||||
<button label="" name="reload_btn"/>
|
||||
<!-- No hay checkboxes de calificación, el escaparate es completamente PG -->
|
||||
<string name="loading_text">
|
||||
Cargando...
|
||||
</string>
|
||||
@@ -208,6 +216,7 @@
|
||||
"http://secondlife.com/app/showcase/index.php?"
|
||||
</string>
|
||||
</panel>
|
||||
<!-- ======================== -->
|
||||
<panel label="Venta de Terrenos" name="land_sales_panel">
|
||||
<string name="searching_text">
|
||||
Buscando...
|
||||
@@ -216,8 +225,7 @@
|
||||
Ninguno encontrado.
|
||||
</string>
|
||||
<string name="land_help_text">
|
||||
El terreno puede comprarse directamente en la moneda del mundo ([CURRENCY]) , o con [CURRENCY] o [REALCURRENCY]. en una
|
||||
subasta. Para comprarlo directamente, visítalo y pulsa en el nombre del terreno en la barra superior del visor.
|
||||
El terreno puede comprarse directamente en la moneda del mundo ([CURRENCY]), o en una subasta con [CURRENCY] o [REALCURRENCY]. Para comprarlo directamente, visítalo y pulsa en el nombre del terreno en la barra superior del visor.
|
||||
</string>
|
||||
<text name="find">
|
||||
Buscar:
|
||||
@@ -225,6 +233,7 @@ subasta. Para comprarlo directamente, visítalo y pulsa en el nombre del terreno
|
||||
<check_box label="Contenido PG" name="incpg"/>
|
||||
<check_box label="Contenido Mature" name="incmature"/>
|
||||
<check_box label="Contenido Adulto" name="incadult"/>
|
||||
<check_box name="filter_gaming" label="Ocultar Juegos de Azar"/>
|
||||
<combo_box name="type">
|
||||
<combo_item name="AllTypes">
|
||||
Todos los tipos
|
||||
@@ -239,11 +248,11 @@ subasta. Para comprarlo directamente, visítalo y pulsa en el nombre del terreno
|
||||
En Venta - Estado
|
||||
</combo_item>
|
||||
</combo_box>
|
||||
<check_box label="Precio " name="pricecheck"/>
|
||||
<check_box label="Precio ≤" name="pricecheck"/>
|
||||
<text name="pricecheck_symbol">
|
||||
[CURRENCY]
|
||||
</text>
|
||||
<check_box label="Superficie " name="areacheck"/>
|
||||
<check_box label="Superficie ≥" name="areacheck"/>
|
||||
<text name="areacheck_symbol" left="180">
|
||||
m²
|
||||
</text>
|
||||
@@ -260,6 +269,7 @@ subasta. Para comprarlo directamente, visítalo y pulsa en el nombre del terreno
|
||||
<button label="Siguiente >" label_selected="Siguiente >" name="Next >"/>
|
||||
<button label="< Anterior" label_selected="< Anterior" name="< Prev"/>
|
||||
</panel>
|
||||
<!-- ======================== -->
|
||||
<panel label="Lugares" name="places_panel">
|
||||
<string name="searching_text">
|
||||
Buscando...
|
||||
@@ -273,6 +283,7 @@ subasta. Para comprarlo directamente, visítalo y pulsa en el nombre del terreno
|
||||
<check_box label="Contenido PG" name="incpg"/>
|
||||
<check_box label="Contenido Mature" name="incmature"/>
|
||||
<check_box label="Contenido Adulto" name="incadult"/>
|
||||
<check_box name="filter_gaming" label="Ocultar Juegos de Azar"/>
|
||||
<combo_box name="Category">
|
||||
<combo_item name="AnyCategory">
|
||||
Cualquier Categoría
|
||||
@@ -369,6 +380,7 @@ subasta. Para comprarlo directamente, visítalo y pulsa en el nombre del terreno
|
||||
<button label="Siguiente >" label_selected="Siguiente >" name="Next >"/>
|
||||
<button label="< Anterior" label_selected="< Anterior" name="< Prev"/>
|
||||
</panel>
|
||||
<!-- ======================== -->
|
||||
<panel label="Personas" name="people_panel">
|
||||
<string name="searching_text">
|
||||
Buscando...
|
||||
@@ -386,6 +398,7 @@ subasta. Para comprarlo directamente, visítalo y pulsa en el nombre del terreno
|
||||
<button label="Siguiente >" label_selected="Siguiente >" name="Next >"/>
|
||||
<button label="< Anterior" label_selected="< Anterior" name="< Prev"/>
|
||||
</panel>
|
||||
<!-- ======================== -->
|
||||
<panel label="Grupos" name="groups_panel">
|
||||
<string name="searching_text">
|
||||
Buscando...
|
||||
@@ -408,6 +421,15 @@ subasta. Para comprarlo directamente, visítalo y pulsa en el nombre del terreno
|
||||
<column label="Miembros" name="members"/>
|
||||
</scroll_list>
|
||||
</panel>
|
||||
<!-- ======================== -->
|
||||
<panel label="Mercado en línea" name="market_panel">
|
||||
<button label="" name="back_btn"/>
|
||||
<button label="" name="forward_btn"/>
|
||||
<button label="" name="reload_btn"/>
|
||||
<string name="loading_text">Cargando...</string>
|
||||
<string name="done_text">Hecho</string>
|
||||
<string name="redirect_404_url">https://marketplace.secondlife.com/notfound</string>
|
||||
<string name="default_search_page">https://marketplace.secondlife.com/</string>
|
||||
</panel>
|
||||
</tab_container>
|
||||
<panel name="Panel Avatar"/>
|
||||
</floater>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="directory" title="Buscar en Second Life">
|
||||
<tab_container name="Directory Tabs">
|
||||
<panel label="Todo" name="find_all_old_panel">
|
||||
<panel label="Todos" name="find_all_old_panel">
|
||||
<string name="searching_text">
|
||||
Buscando...
|
||||
</string>
|
||||
@@ -17,6 +17,7 @@
|
||||
<check_box label="Contenido PG" name="incpg"/>
|
||||
<check_box label="Contenido Mature" name="incmature"/>
|
||||
<check_box label="Contenido Adulto" name="incadult"/>
|
||||
<check_box name="filter_gaming" label="Ocultar Juegos de Azar"/>
|
||||
<scroll_list name="results">
|
||||
<column label="" name="icon"/>
|
||||
<column label="Nombre" name="name"/>
|
||||
@@ -30,6 +31,7 @@
|
||||
<column label="Miembros" name="members"/>
|
||||
</scroll_list>
|
||||
</panel>
|
||||
<!-- ======================== -->
|
||||
<panel label="Clasificados" name="classified_panel">
|
||||
<string name="searching_text">
|
||||
Buscando...
|
||||
@@ -43,12 +45,13 @@
|
||||
<check_box label="Contenido PG" name="incpg"/>
|
||||
<check_box label="Contenido Mature" name="incmature"/>
|
||||
<check_box label="Contenido Adulto" name="incadult"/>
|
||||
<check_box name="filter_gaming" label="Ocultar Juegos de Azar"/>
|
||||
<combo_box name="Category">
|
||||
<combo_item name="AnyCategory">
|
||||
Cualquier Categoría
|
||||
</combo_item>
|
||||
<combo_item name="Shopping">
|
||||
Compra
|
||||
Compras
|
||||
</combo_item>
|
||||
<combo_item name="LandRental">
|
||||
Terreno en alquiler
|
||||
@@ -88,6 +91,7 @@
|
||||
<button label="Sig. >" label_selected="Sig. >" name="Next >"/>
|
||||
<button label="< Ant." label_selected="< Ant." name="< Prev"/>
|
||||
</panel>
|
||||
<!-- ======================== -->
|
||||
<panel label="Eventos" name="events_panel">
|
||||
<string name="searching_text">
|
||||
Buscando...
|
||||
@@ -156,6 +160,7 @@
|
||||
<check_box label="Contenido PG" name="incpg"/>
|
||||
<check_box label="Contenido Mature" name="incmature"/>
|
||||
<check_box label="Contenido Adult" name="incadult"/>
|
||||
<check_box name="filter_gaming" label="Ocultar Juegos de Azar"/>
|
||||
<button label="Buscar" label_selected="Buscar" name="Search"/>
|
||||
<button label="Borrar" label_selected="Borrar" name="Delete"/>
|
||||
<scroll_list name="results">
|
||||
@@ -169,6 +174,7 @@
|
||||
<button label="Sig. >" label_selected="Sig. >" name="Next >"/>
|
||||
<button label="< Ant." label_selected="< Ant." name="< Prev"/>
|
||||
</panel>
|
||||
<!-- ======================== -->
|
||||
<panel label="Venta de Terrenos" name="land_sales_panel">
|
||||
<string name="searching_text">
|
||||
Buscando...
|
||||
@@ -177,8 +183,7 @@
|
||||
Ninguno Encontrado.
|
||||
</string>
|
||||
<string name="land_help_text">
|
||||
El terreno puede comprarse directamente en la moneda del mundo ([CURRENCY]) , o con [CURRENCY] o [REALCURRENCY]. en una
|
||||
subasta. Para comprarlo directamente, visítalo y pulsa en el nombre del terreno en la barra superior del visor.
|
||||
El terreno puede comprarse directamente en la moneda del mundo ([CURRENCY]) , o en una subasta con [CURRENCY] o [REALCURRENCY]. Para comprarlo directamente, visítalo y pulsa en el nombre del terreno en la barra superior del visor.
|
||||
</string>
|
||||
<text name="find">
|
||||
Buscar:
|
||||
@@ -186,6 +191,7 @@ subasta. Para comprarlo directamente, visítalo y pulsa en el nombre del terreno
|
||||
<check_box label="Contenido PG" name="incpg"/>
|
||||
<check_box label="Contenido Mature" name="incmature"/>
|
||||
<check_box label="Contenido Adult" name="incadult"/>
|
||||
<check_box name="filter_gaming" label="Ocultar Juegos de Azar"/>
|
||||
<combo_box name="type">
|
||||
<combo_item name="AllTypes">
|
||||
Todos los tipos
|
||||
@@ -221,6 +227,7 @@ subasta. Para comprarlo directamente, visítalo y pulsa en el nombre del terreno
|
||||
<button label="Sig. >" label_selected="Sig. >" name="Next >"/>
|
||||
<button label="< Ant." label_selected="< Ant." name="< Prev"/>
|
||||
</panel>
|
||||
<!-- ======================== -->
|
||||
<panel label="Lugares" name="places_panel">
|
||||
<string name="searching_text">
|
||||
Buscando...
|
||||
@@ -234,6 +241,7 @@ subasta. Para comprarlo directamente, visítalo y pulsa en el nombre del terreno
|
||||
<check_box label="Contenido PG" name="incpg"/>
|
||||
<check_box label="Contenido Mature" name="incmature"/>
|
||||
<check_box label="Contenido Adulto" name="incadult"/>
|
||||
<check_box name="filter_gaming" label="Ocultar Juegos de Azar"/>
|
||||
<combo_box name="Category">
|
||||
<combo_item name="AnyCategory">
|
||||
Cualquier Categoría
|
||||
@@ -326,12 +334,13 @@ subasta. Para comprarlo directamente, visítalo y pulsa en el nombre del terreno
|
||||
<scroll_list name="results">
|
||||
<column label="" name="icon"/>
|
||||
<column label="" name="type"/>
|
||||
<column label="Nombre" name="name" />
|
||||
<column abel="Nombre" name="name" />
|
||||
<column label="Tráfico" name="dwell"/>
|
||||
</scroll_list>
|
||||
<button label="Sig. >" label_selected="Sig. >" name="Next >"/>
|
||||
<button label="< Ant." label_selected="< Ant." name="< Prev"/>
|
||||
</panel>
|
||||
<!-- ======================== -->
|
||||
<panel label="Personas" name="people_panel">
|
||||
<string name="searching_text">
|
||||
Buscando...
|
||||
@@ -351,6 +360,7 @@ subasta. Para comprarlo directamente, visítalo y pulsa en el nombre del terreno
|
||||
<button label="Sig. >" label_selected="Sig. >" name="Next >"/>
|
||||
<button label="< Ant." label_selected="< Ant." name="< Prev"/>
|
||||
</panel>
|
||||
<!-- ======================== -->
|
||||
<panel label="Grupos" name="groups_panel">
|
||||
<string name="searching_text">
|
||||
Buscando...
|
||||
@@ -367,6 +377,7 @@ subasta. Para comprarlo directamente, visítalo y pulsa en el nombre del terreno
|
||||
<check_box label="Contenido PG" name="incpg"/>
|
||||
<check_box label="Contenido Mature" name="incmature"/>
|
||||
<check_box label="Contenido Adulto" name="incadult"/>
|
||||
<check_box name="filter_gaming" label="Ocultar Juegos de Azar"/>
|
||||
<scroll_list name="results">
|
||||
<column label="" name="icon"/>
|
||||
<column label="" name="type"/>
|
||||
@@ -376,12 +387,4 @@ subasta. Para comprarlo directamente, visítalo y pulsa en el nombre del terreno
|
||||
</scroll_list>
|
||||
</panel>
|
||||
</tab_container>
|
||||
<panel name="classified_details_panel"/>
|
||||
<panel name="Panel Avatar"/>
|
||||
<panel name="event_details_panel"/>
|
||||
<panel name="group_details_panel_holder">
|
||||
<panel name="group_details_panel"/>
|
||||
</panel>
|
||||
<panel name="place_details_panel"/>
|
||||
<panel name="place_details_small_panel"/>
|
||||
</floater>
|
||||
|
||||
@@ -405,7 +405,7 @@ subasta. Para comprarlo directamente, visítalo y pulsa en el nombre del terreno
|
||||
<scroll_list name="results">
|
||||
<column label="" name="icon"/>
|
||||
<column label="" name="type"/>
|
||||
<column label="Nombre" name="name" />
|
||||
<column abel="Nombre" name="name" />
|
||||
<column label="Tráfico" name="dwell"/>
|
||||
</scroll_list>
|
||||
<button label="Sig. >" label_selected="Sig. >" name="Next >"/>
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
<button label="Expulsar a todos los usuarios" label_selected="Expulsar a todos los usuarios" name="Kick all users" width="200"/>
|
||||
<button label="Vaciar caché de visibilidad del Mapa de esta Región" label_selected="Vaciar caché de visibilidad del Mapa de esta Región" name="Flush This Region's Map Visibility Caches" width="350"/>
|
||||
</panel>
|
||||
<!-- ======================== -->
|
||||
<panel label="Región" name="region">
|
||||
<text name="Sim Name:">
|
||||
Nombre del Sim:
|
||||
@@ -17,6 +18,8 @@
|
||||
<check_box label="Bloquear Seguimiento de Tráfico" name="block dwell" tool_tip="Marcar aquí para que esta región no compute el tráfico"/>
|
||||
<check_box label="Bloquear Terraformado" name="block terraform" tool_tip="Marcar aquí para impedir que los usuarios puedan terraformar sus terrenos"/>
|
||||
<check_box label="Sandbox" name="is sandbox" tool_tip="Definir cuando esta región es o no un sandbox."/>
|
||||
<check_box name="is gaming" label="Juegos de Azar" tool_tip="Marcar si es o no una región de juegos de azar."/>
|
||||
<check_box name="hide from search" label="Ocultar Región en las búsquedas" tool_tip="Marcar si esta región aparecerá o no en las búsquedas."/>
|
||||
<button label="Resguardar Terreno" label_selected="Resguardar Terreno" name="Bake Terrain" tool_tip="Guardar el terreno actual como predefinido"/>
|
||||
<button label="Revertir Terreno" label_selected="Revertir Terreno" name="Revert Terrain" tool_tip="Sustituir el terreno actual por el predefinido"/>
|
||||
<button label="Intercambiar Terreno" label_selected="Intercambiar Terreno" name="Swap Terrain" tool_tip="Intercambiar terreno por el predefinido"/>
|
||||
@@ -26,7 +29,7 @@
|
||||
<text name="parent id">
|
||||
ID del padre:
|
||||
</text>
|
||||
<line_editor name="parentestate" tool_tip="Esta es una propiedad padre para esta región"/>
|
||||
<line_editor name="parentestate" tool_tip="Este es un Estado padre para esta región"/>
|
||||
<text name="Grid Pos: ">
|
||||
Pos. del Grid:
|
||||
</text>
|
||||
@@ -46,7 +49,11 @@
|
||||
<button label="Seleccionar Región" label_selected="Seleccionar Región" name="Select Region" tool_tip="Seccionar toda la región con la herramienta de terreno"/>
|
||||
<button label="Guardado Automático Ahora" label_selected="Guardado Automático Ahora" name="Autosave now" tool_tip="Guardar con gzip el estado actual en el directorio de guardado automático"/>
|
||||
</panel>
|
||||
<!-- ======================== -->
|
||||
<panel label="Objetos" name="objects">
|
||||
<string name="no_target">
|
||||
(ningún objetivo)
|
||||
</string>
|
||||
<text name="Sim Name:">
|
||||
Nombre del Sim:
|
||||
</text>
|
||||
@@ -68,6 +75,7 @@
|
||||
<button label="Obtener Principales Scripts" label_selected="Obtener Principales Scripts" name="Get Top Scripts" tool_tip="Obtiene una lista de los objetos que consumen mas tiempo ejecutando scripts"/>
|
||||
<button label="Compilación de Scripts" label_selected="Compilación de Scripts" name="Scripts digest" tool_tip="Obtener un listado de todos los scripts y número de ocurrencias de cada uno."/>
|
||||
</panel>
|
||||
<!-- ======================== -->
|
||||
<panel label="Solicitar" name="request">
|
||||
<text name="Destination:">
|
||||
Destino:
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="Inventory" title="Inventario">
|
||||
<search_editor label="Escribe aquí para buscar" name="inventory search editor"/>
|
||||
<button label="" name="collapse_btn" tool_tip="Cerrar Todo" />
|
||||
<button label="" name="collapse_btn" tool_tip="Contraer Todo" />
|
||||
<button label="" name="Inventory.ExpandAll" tool_tip="Expandir Todo"/>
|
||||
<button name="Inventory.ResetAll" tool_tip="Cerrar Todo y Limpiar Filtros"/>
|
||||
<button label="" name="Inventory.ResetAll" tool_tip="Contraer Todo y Limpiar Filtros"/>
|
||||
<text name="group_titles_textbox">
|
||||
Tipos:
|
||||
</text>
|
||||
@@ -97,54 +97,51 @@
|
||||
</tab_container>
|
||||
<menu_bar name="Inventory Menu">
|
||||
<menu label="Archivo" name="File">
|
||||
<menu_item_call label="Abrir" name="Open"></menu_item_call>
|
||||
<menu_item_separator name="separator"/>
|
||||
<menu_item_call label="Nueva Ventana" name="New Window"></menu_item_call>
|
||||
<menu_item_separator name="separator2"/>
|
||||
<menu_item_call label="Mostrar Filtros" name="Show Filters"></menu_item_call>
|
||||
<menu_item_call label="Restablecer Filtros" name="Reset Current"></menu_item_call>
|
||||
<menu_item_call label="Cerrar todas las Carpetas" name="Close All Folders"></menu_item_call>
|
||||
<menu_item_separator name="separator3"/>
|
||||
<menu_item_call label="Vaciar la Papelera" name="Empty Trash"></menu_item_call>
|
||||
<menu_item_call label="Actualizar Inventario" name="Refresh Inventory"></menu_item_call>
|
||||
<menu_item_call label="Abrir" name="Open"/>
|
||||
<menu_item_call label="Nueva Ventana" name="New Window"/>
|
||||
<menu_item_call label="Mostrar Filtros" name="Show Filters"/>
|
||||
<menu_item_call label="Restablecer Filtros" name="Reset Current"/>
|
||||
<menu_item_call label="Cerrar todas las Carpetas" name="Close All Folders"/>
|
||||
<menu_item_call label="Vaciar la Papelera" name="Empty Trash"/>
|
||||
<menu_item_call label="Actualizar Inventario" name="Refresh Inventory"/>
|
||||
</menu>
|
||||
<menu label="Crear" name="Create">
|
||||
<menu_item_call label="Nueva Carpeta" name="New Folder"></menu_item_call>
|
||||
<menu_item_call label="Nuevo Script" name="New Script"></menu_item_call>
|
||||
<menu_item_call label="Nueva Nota" name="New Note"></menu_item_call>
|
||||
<menu_item_call label="Nuevo Gesto" name="New Gesture"></menu_item_call>
|
||||
<menu_item_call label="Nueva Carpeta" name="New Folder"/>
|
||||
<menu_item_call label="Nuevo Script" name="New Script"/>
|
||||
<menu_item_call label="Nueva Nota" name="New Note"/>
|
||||
<menu_item_call label="Nuevo Gesto" name="New Gesture"/>
|
||||
<menu label="Ropas Nuevas" name="New Clothes">
|
||||
<menu_item_call label="Nueva Camisa" name="New Shirt"></menu_item_call>
|
||||
<menu_item_call label="Nuevos Pantalones" name="New Pants"></menu_item_call>
|
||||
<menu_item_call label="Nuevos Zapatos" name="New Shoes"></menu_item_call>
|
||||
<menu_item_call label="Nuevas Medias" name="New Socks"></menu_item_call>
|
||||
<menu_item_call label="Nueva Chaqueta" name="New Jacket"></menu_item_call>
|
||||
<menu_item_call label="Nueva Falda" name="New Skirt"></menu_item_call>
|
||||
<menu_item_call label="Nuevos Guantes" name="New Gloves"></menu_item_call>
|
||||
<menu_item_call label="Nueva Camiseta" name="New Undershirt"></menu_item_call>
|
||||
<menu_item_call label="Nueva Ropa Interior" name="New Underpants"></menu_item_call>
|
||||
<menu_item_call label="Nuevo Tatuaje" name="New Tattoo"></menu_item_call>
|
||||
<menu_item_call label="Nueva Capa Alfa" name="New Alpha"></menu_item_call>
|
||||
<menu_item_call label="Nueva Física" name="New Physics"></menu_item_call>
|
||||
</menu>
|
||||
<menu label="Partes de Cuerpo Nuevas" name="New Body Parts">
|
||||
<menu_item_call label="Nueva Forma" name="New Shape"></menu_item_call>
|
||||
<menu_item_call label="Nueva Piel" name="New Skin"></menu_item_call>
|
||||
<menu_item_call label="Nuevo Pelo" name="New Hair"></menu_item_call>
|
||||
<menu_item_call label="Nuevos Ojos" name="New Eyes"></menu_item_call>
|
||||
</menu>
|
||||
<menu_item_call label="Nueva Camisa" name="New Shirt"/>
|
||||
<menu_item_call label="Nuevos Pantalones" name="New Pants"/>
|
||||
<menu_item_call label="Nuevos Zapatos" name="New Shoes"/>
|
||||
<menu_item_call label="Nuevas Medias" name="New Socks"/>
|
||||
<menu_item_call label="Nueva Chaqueta" name="New Jacket"/>
|
||||
<menu_item_call label="Nueva Falda" name="New Skirt"/>
|
||||
<menu_item_call label="Nuevos Guantes" name="New Gloves"/>
|
||||
<menu_item_call label="Nueva Camiseta" name="New Undershirt"/>
|
||||
<menu_item_call label="Nueva Ropa Interior" name="New Underpants"/>
|
||||
<menu_item_call label="Nuevo Tatuaje" name="New Tattoo"/>
|
||||
<menu_item_call label="Nueva Capa Alfa" name="New Alpha"/>
|
||||
<menu_item_call label="Nueva Física" name="New Physics"/>
|
||||
</menu>
|
||||
<menu label="Partes de Cuerpo Nuevas" name="New Body Parts">
|
||||
<menu_item_call label="Nueva Forma" name="New Shape"/>
|
||||
<menu_item_call label="Nueva Piel" name="New Skin"/>
|
||||
<menu_item_call label="Nuevo Pelo" name="New Hair"/>
|
||||
<menu_item_call label="Nuevos Ojos" name="New Eyes"/>
|
||||
</menu>
|
||||
<menu_item_call label="Nuevo Vestuario" name="New Outfit"/>
|
||||
</menu>
|
||||
<menu label="Ordenar" name="Sort">
|
||||
<menu_item_check label="Por Nombre" name="By Name"></menu_item_check>
|
||||
<menu_item_check label="Por Fecha" name="By Date"></menu_item_check>
|
||||
<menu_item_separator name="separator"/>
|
||||
<menu_item_check label="Carpetas, siempre por Nombre" name="Folders Always By Name"></menu_item_check>
|
||||
<menu_item_check label="Carpeta de Sistema al Principio" name="System Folders To Top"></menu_item_check>
|
||||
<menu_item_check label="Por Nombre" name="By Name"/>
|
||||
<menu_item_check label="Por Fecha" name="By Date"/>
|
||||
<menu_item_check label="Carpetas, siempre por Nombre" name="Folders Always By Name"/>
|
||||
<menu_item_check label="Carpetas de Sistema al Principio" name="System Folders To Top"/>
|
||||
</menu>
|
||||
<menu label="Buscar" name="Search">
|
||||
<menu_item_check label="Nombre del Item" name="Item name"></menu_item_check>
|
||||
<menu_item_check label="Descripción del Item" name="Item description"></menu_item_check>
|
||||
<menu_item_check label="Creador del Item" name="Item creatorr"></menu_item_check>
|
||||
<menu_item_check label="Nombre del Ítem" name="Item name"/>
|
||||
<menu_item_check label="Descripción del Ítem" name="Item description"/>
|
||||
<menu_item_check label="Creador del Ítem" name="Item creatorr"/>
|
||||
</menu>
|
||||
</menu_bar>
|
||||
</floater>
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="floater_inventory_backup" title="Respaldar Inventario">
|
||||
<scroll_list name="item_list">
|
||||
<column name="type" width="20" />
|
||||
<column label="Nombre" name="name" />
|
||||
<column label="Estado" name="status"/>
|
||||
</scroll_list>
|
||||
</floater>
|
||||
@@ -1,15 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="inventory_backup_settings" title="Opciones de Descarga">
|
||||
<check_box name="chk_textures" label="Texturas" />
|
||||
<check_box name="chk_sounds" label="Sonidos" />
|
||||
<check_box name="chk_callingcards" label="Tarjetas de LLamada" />
|
||||
<check_box name="chk_landmarks" label="Hitos" />
|
||||
<check_box name="chk_scripts" label="Scripts" />
|
||||
<check_box name="chk_wearables" label="Wearables" />
|
||||
<check_box name="chk_objects" label="Objetos" />
|
||||
<check_box name="chk_notecards" label="Notas" />
|
||||
<check_box name="chk_animations" label="Animaciones" />
|
||||
<check_box name="chk_gestures" label="Gestos" />
|
||||
<!--<check_box bottom_delta="-20" follows="left|top" left="10" name="chk_others" label="Others" />-->
|
||||
<button label="Siguiente >>" name="next_btn" />
|
||||
</floater>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="item properties" title="Propiedades de los Items de Inventario">
|
||||
<floater name="item properties" title="Propiedades Ítems de Inventario">
|
||||
<text name="LabelItemNameTitle">
|
||||
Nombre:
|
||||
</text>
|
||||
@@ -29,9 +29,10 @@
|
||||
<text name="OwnerLabel">
|
||||
Puedes:
|
||||
</text>
|
||||
<check_box label="Modificar" name="CheckOwnerModify"/>
|
||||
<check_box label="Copiar" name="CheckOwnerCopy"/>
|
||||
<check_box label="Venderlo/Darlo" name="CheckOwnerTransfer"/>
|
||||
<check_box label="Modificarlo" name="CheckOwnerModify"/>
|
||||
<check_box label="Copiarlo" name="CheckOwnerCopy"/>
|
||||
<check_box label="Transferirlo" name="CheckOwnerTransfer"/>
|
||||
<check_box name="CheckOwnerExport" label="Exportarlo"/>
|
||||
<text name="BaseMaskDebug">
|
||||
B:
|
||||
</text>
|
||||
@@ -51,19 +52,20 @@
|
||||
Los miembros del grupo pueden:
|
||||
</text>
|
||||
<check_box label="Modificarlo" name="CheckGroupMod"/>
|
||||
<check_box label="Copiarlo" name="CheckGroupCopy"/>
|
||||
<check_box label="Moverlo" name="CheckGroupMove"/>
|
||||
<check_box label="Copiarlo" name="CheckGroupCopy" left_delta="88"/>
|
||||
<check_box label="Moverlo" name="CheckGroupMove" left_delta="78"/>
|
||||
<text name="EveryoneLabel">
|
||||
Cualquiera puede:
|
||||
</text>
|
||||
<check_box label="Copiarlo" name="CheckEveryoneCopy"/>
|
||||
<check_box label="Moverlo" name="CheckEveryoneMove"/>
|
||||
<check_box label="Copiarlo" name="CheckEveryoneCopy" left="98"/>
|
||||
<check_box label="Moverlo" name="CheckEveryoneMove" left_delta="78"/>
|
||||
<check_box name="CheckExport" label="Exportarlo"/>
|
||||
<text name="NextOwnerLabel" width="250">
|
||||
El próximo propietario puede:
|
||||
</text>
|
||||
<check_box label="Modificarlo" name="CheckNextOwnerModify"/>
|
||||
<check_box label="Copiarlo" name="CheckNextOwnerCopy"/>
|
||||
<check_box label="Venderlo/Darlo" name="CheckNextOwnerTransfer"/>
|
||||
<check_box label="Copiarlo" name="CheckNextOwnerCopy" left_delta="88"/>
|
||||
<check_box label="Transferirlo" name="CheckNextOwnerTransfer" left_delta="78"/>
|
||||
<text name="SaleLabel" width="150">
|
||||
Marcar Ítem como:
|
||||
</text>
|
||||
|
||||
@@ -13,17 +13,15 @@
|
||||
<column name="bitmap_uuid" label="UUID"/>
|
||||
</scroll_list>
|
||||
<!-- left side done, right side begin -->
|
||||
<line_editor name="path_text"/>
|
||||
<text name="path_caption_text">
|
||||
Ruta Local:
|
||||
</text>
|
||||
<line_editor name="uuid_text" />
|
||||
<text name="uuid_caption_text">
|
||||
Local UdddUID:
|
||||
UUID Local:
|
||||
</text>
|
||||
<texture_picker label="Textura" name="texture_view"/>
|
||||
<check_box label="Mantener Actualizado" name="keep_updating_checkbox" tool_tip="Activar o desactivar el control periódico de las fuentes de bitmaps en tu disco duro para ver si han sido actualizadas"/>
|
||||
<combo_box name="type_combobox">
|
||||
<check_box label="Mantener Actualizado" name="keep_updating_checkbox" tool_tip="Activar o desactivar el control periódico de las fuentes de bitmaps en tu disco duro para ver si han sido actualizadas" left_delta="80"/>
|
||||
<combo_box name="type_combobox" left_delta="140">
|
||||
<combo_item name="type_texture" value="type_texture">
|
||||
Textura
|
||||
</combo_item>
|
||||
@@ -44,7 +42,7 @@
|
||||
Enlace:
|
||||
</text>
|
||||
<text name="link_text">
|
||||
(Estado del Link)
|
||||
(Estado del enlace)
|
||||
</text>
|
||||
<text name="name_caption_text">
|
||||
Nombre:
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="floater_pathfinding_characters" title="Personajes Pathfinding">
|
||||
<string name="messaging_initial"></string>
|
||||
<string name="messaging_get_inprogress">
|
||||
Consultando Querying los personajes pathfinding ...
|
||||
</string>
|
||||
<string name="messaging_get_error">
|
||||
Error detectado al consultar los personajes pathfinding.
|
||||
</string>
|
||||
<string name="messaging_set_inprogress"></string>
|
||||
<string name="messaging_set_error"></string>
|
||||
<string name="messaging_complete_none_found">
|
||||
Sin personajes pathfinding.
|
||||
</string>
|
||||
<string name="messaging_complete_available">
|
||||
[NUM_SELECTED] personajes seleccionados de un total de [NUM_TOTAL].
|
||||
</string>
|
||||
<string name="messaging_not_enabled">
|
||||
Esta región no tiene pathfinding habilitado.
|
||||
</string>
|
||||
<string name="character_cpu_time">
|
||||
[CPU_TIME] µs
|
||||
</string>
|
||||
<string name="character_owner_loading">
|
||||
[Cargando]
|
||||
</string>
|
||||
<string name="character_owner_unknown">
|
||||
[Desconocido]
|
||||
</string>
|
||||
<string name="character_owner_group">
|
||||
[grupo]
|
||||
</string>
|
||||
<panel name="pathfinding_chars_main">
|
||||
<scroll_list name="objects_scroll_list">
|
||||
<column label="Nombre" name="name"/>
|
||||
<column label="Descripción" name="description"/>
|
||||
<column label="Propietario" name="owner"/>
|
||||
<column label="CPU" name="cpu_time"/>
|
||||
<column label="Altitud" name="altitude"/>
|
||||
</scroll_list>
|
||||
<text name="messaging_status">
|
||||
Personajes:
|
||||
</text>
|
||||
<button label="Actualizar Lista" name="refresh_objects_list"
|
||||
left_delta="238"
|
||||
bottom_delta="10"
|
||||
width="100"/>
|
||||
<button label="Seleccionar Todo" name="select_all_objects"
|
||||
left_delta="105"
|
||||
bottom_delta="0"
|
||||
width="115"/>
|
||||
<button label="Seleccionar Ninguno" name="select_none_objects"
|
||||
left_delta="120"
|
||||
bottom_delta="0"
|
||||
width="135"/>
|
||||
</panel>
|
||||
<view_border name="horiz_separator"/>
|
||||
<panel name="pathfinding_chars_actions">
|
||||
<text name="actions_label" >
|
||||
Acciones sobre los personajes seleccionados:
|
||||
</text>
|
||||
<check_box label="Mostrar Baliza" name="show_beacon" left_delta="242"
|
||||
bottom_delta="-5"
|
||||
width="150" />
|
||||
<!-- Singu NOTE: Requires havok
|
||||
<check_box
|
||||
height="19"
|
||||
follows="left|bottom"
|
||||
label="Show physics capsule"
|
||||
layout="topleft"
|
||||
name="show_physics_capsule"
|
||||
top_pad="-19"
|
||||
left_delta="150"
|
||||
bottom_delta="0"
|
||||
width="150" />
|
||||
-->
|
||||
<button label="Recoger" name="take_objects"
|
||||
left="18"
|
||||
bottom_delta="-25"
|
||||
width="80"/>
|
||||
<button label="Recoger una copia" name="take_copy_objects"
|
||||
left_delta="90"
|
||||
bottom_delta="0"
|
||||
width="120"/>
|
||||
<button label="Teleportarme hacia ahí" name="teleport_me_to_object"
|
||||
tool_tip="Habilitado solamente cuando se ha seleccionado un solo personaje."
|
||||
left_delta="130"
|
||||
bottom_delta="0"
|
||||
width="159"/>
|
||||
<button label="Devolver" name="return_objects"
|
||||
left_delta="195"
|
||||
bottom_delta="0"
|
||||
width="90"/>
|
||||
<button label="Borrar" name="delete_objects"
|
||||
left_delta="100"
|
||||
bottom_delta="0"
|
||||
width="90"/>
|
||||
</panel>
|
||||
</floater>
|
||||
@@ -0,0 +1,191 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="floater_pathfinding_linksets" title="Conjuntos de Enlaces Pathfinding">
|
||||
<string name="messaging_initial"></string>
|
||||
<string name="messaging_get_inprogress">
|
||||
Consultando los Conjuntos de Enlaces de pathfinding ...
|
||||
</string>
|
||||
<string name="messaging_get_error">
|
||||
Error detectado al consultar los conjuntos de enlaces de pathfinding.
|
||||
</string>
|
||||
<string name="messaging_set_inprogress">
|
||||
Modificando los conjuntos de enlaces de pathfinding seleccionados...
|
||||
</string>
|
||||
<string name="messaging_set_error">
|
||||
Error detectado al modificar los conjuntos de enlaces de pathfinding seleccionados.
|
||||
</string>
|
||||
<string name="messaging_complete_none_found">
|
||||
Sin conjuntos de enlaces de pathfinding.
|
||||
</string>
|
||||
<string name="messaging_complete_available">
|
||||
[NUM_SELECTED] conjuntos de enlaces de un total de [NUM_TOTAL].
|
||||
</string>
|
||||
<string name="messaging_not_enabled">
|
||||
Esta región no tiene pathfinding habilitado.
|
||||
</string>
|
||||
<string name="linkset_terrain_name">
|
||||
[Terreno]
|
||||
</string>
|
||||
<string name="linkset_terrain_description">--</string>
|
||||
<string name="linkset_terrain_owner">--</string>
|
||||
<string name="linkset_terrain_scripted">--</string>
|
||||
<string name="linkset_terrain_land_impact">--</string>
|
||||
<string name="linkset_terrain_dist_from_you">--</string>
|
||||
<string name="linkset_owner_loading">
|
||||
[Cargando]
|
||||
</string>
|
||||
<string name="linkset_owner_unknown">
|
||||
[Desconocido]
|
||||
</string>
|
||||
<string name="linkset_owner_group">
|
||||
[grupo]
|
||||
</string>
|
||||
<string name="linkset_is_scripted">
|
||||
Si
|
||||
</string>
|
||||
<string name="linkset_is_not_scripted">
|
||||
No
|
||||
</string>
|
||||
<string name="linkset_is_unknown_scripted">
|
||||
Desconocido
|
||||
</string>
|
||||
<string name="linkset_use_walkable">
|
||||
Transitable
|
||||
</string>
|
||||
<string name="linkset_use_static_obstacle">
|
||||
Obstáculo estático
|
||||
</string>
|
||||
<string name="linkset_use_dynamic_obstacle">
|
||||
Obstáculo móvil
|
||||
</string>
|
||||
<string name="linkset_use_material_volume">
|
||||
Masa Material
|
||||
</string>
|
||||
<string name="linkset_use_exclusion_volume">
|
||||
Masa de Exclusión
|
||||
</string>
|
||||
<string name="linkset_use_dynamic_phantom">
|
||||
Inmaterial móvil
|
||||
</string>
|
||||
<string name="linkset_is_terrain">
|
||||
[no modificable]
|
||||
</string>
|
||||
<string name="linkset_is_restricted_state">
|
||||
[restringido]
|
||||
</string>
|
||||
<string name="linkset_is_non_volume_state">
|
||||
[concavo]
|
||||
</string>
|
||||
<string name="linkset_is_restricted_non_volume_state">
|
||||
[restringido,concavo]
|
||||
</string>
|
||||
<string name="linkset_choose_use">
|
||||
Seleccionar uso del conjunto de enlaces...
|
||||
</string>
|
||||
<panel name="pathfinding_linksets_main">
|
||||
<text name="linksets_filter_label">
|
||||
Filtrar por:
|
||||
</text>
|
||||
<text name="linksets_name_label">
|
||||
Nombre
|
||||
</text>
|
||||
<text name="linksets_desc_label">
|
||||
Descripción
|
||||
</text>
|
||||
<combo_box name="filter_by_linkset_use">
|
||||
<combo_item name="filter_by_linkset_use_none">
|
||||
Filtrar por uso de conjunto de enlaces...
|
||||
</combo_item>
|
||||
<combo_item name="filter_by_linkset_use_walkable">
|
||||
Transitable
|
||||
</combo_item>
|
||||
<combo_item name="filter_by_linkset_use_static_obstacle">
|
||||
Obstáculo estático
|
||||
</combo_item>
|
||||
<combo_item name="filter_by_linkset_use_dynamic_obstacle">
|
||||
Obstáculo móvil
|
||||
</combo_item>
|
||||
<combo_item name="filter_by_linkset_use_material_volume">
|
||||
Masa Material
|
||||
</combo_item>
|
||||
<combo_item name="filter_by_linkset_use_exclusion_volume">
|
||||
Masa de Exclusion
|
||||
</combo_item>
|
||||
<combo_item name="filter_by_linkset_use_dynamic_phantom">
|
||||
Inmaterial móvil
|
||||
</combo_item>
|
||||
</combo_box>
|
||||
<button label="Aplicar" name="apply_filters"/>
|
||||
<button label="Limpiar" name="clear_filters"/>
|
||||
<scroll_list name="objects_scroll_list">
|
||||
<column label="Nombre (prim raíz)" name="name"/>
|
||||
<column label="Descripción (prim raíz)" name="description"/>
|
||||
<column label="Propietario" name="owner"/>
|
||||
<column label="Scripts" name="scripted"/>
|
||||
<column label="Impacto" name="land_impact" width="63" />
|
||||
<column label="Distancia" name="dist_from_you"/>
|
||||
<column label="Uso Conjunto de Enlaces" name="linkset_use" width="226" />
|
||||
<column label="A%" name="a_percent"/>
|
||||
<column label="B%" name="b_percent"/>
|
||||
<column label="C%" name="c_percent"/>
|
||||
<column label="D%" name="d_percent"/>
|
||||
</scroll_list>
|
||||
<text name="messaging_status">
|
||||
Conjuntos de Enlace:
|
||||
</text>
|
||||
<button label="Actualizar Lista" name="refresh_objects_list" left_delta="670" width="110"/>
|
||||
<button label="Seleccionar Todo" name="select_all_objects" left_delta="115"/>
|
||||
<button label="Seleccionar Ninguno" name="select_none_objects" left_delta="120" width="135"/>
|
||||
</panel>
|
||||
<view_border name="horiz_separator"/>
|
||||
<panel name="pathfinding_linksets_actions" >
|
||||
<text name="linksets_actions_label">
|
||||
Actiones sobre conjuntos de enlaces (Si uno es quitado del mundo sus atributos se perderán):
|
||||
</text>
|
||||
<check_box label="Mostrar Baliza" name="show_beacon"/>
|
||||
<button label="Recoger" name="take_objects"/>
|
||||
<button label="Recoger una copiar" name="take_copy_objects" width="120"/>
|
||||
<button label="Teleportarme hacia ahí" name="teleport_me_to_object"/>
|
||||
<button label="Devolver" name="return_objects"/>
|
||||
<button label="Borrar" name="delete_objects"/>
|
||||
</panel>
|
||||
<view_border name="horiz_separator"/>
|
||||
<panel name="pathfinding_linksets_attributes" >
|
||||
<text name="linksets_attributes_label">
|
||||
Edita los atributos del conjunto de enlaces seleccionado y presiona el botón para aplicar los cambios
|
||||
</text>
|
||||
<combo_box name="edit_linkset_use">
|
||||
</combo_box>
|
||||
<text name="walkability_coefficients_label">
|
||||
Transitabilidad:
|
||||
</text>
|
||||
<text name="edit_a_label">
|
||||
A
|
||||
</text>
|
||||
<line_editor name="edit_a_value" tool_tip="Transibilidad del personaje de tipo A. Un ejemplo de personaje de este tipo es Humanoide."/>
|
||||
<text name="edit_b_label">
|
||||
B
|
||||
</text>
|
||||
<line_editor name="edit_b_value" tool_tip="Transibilidad del personaje de tipo B. Un ejemplo de personaje de este tipo es Criatura."/>
|
||||
<text name="edit_c_label">
|
||||
C
|
||||
</text>
|
||||
<line_editor name="edit_c_value" tool_tip="Transibilidad del personaje de tipo C. Un ejemplo de personaje de este tipo es un Mecánico."/>
|
||||
<text name="edit_d_label" >
|
||||
D
|
||||
</text>
|
||||
<line_editor name="edit_d_value" tool_tip="Transibilidad del personaje de tipo D. Un ejemplo de personaje de este tipo es Otro."/>
|
||||
<button label="Aplicar cambios" name="apply_edit_values"/>
|
||||
<text name="suggested_use_a_label">
|
||||
(Humanoide)
|
||||
</text>
|
||||
<text name="suggested_use_b_label">
|
||||
(Criatura)
|
||||
</text>
|
||||
<text name="suggested_use_c_label">
|
||||
(Mecánico)
|
||||
</text>
|
||||
<text name="suggested_use_d_label">
|
||||
(Otro)
|
||||
</text>
|
||||
</panel>
|
||||
</floater>
|
||||
@@ -4,12 +4,13 @@
|
||||
<button label="?" label_selected="?" name="help"/>
|
||||
<check_box label="Compartir con el Grupo" name="share_with_group"/>
|
||||
<check_box label="Permitir copiar a cualquiera" name="everyone_copy"/>
|
||||
<check_box label="Permitir Exportar" name="everyone_export"/>
|
||||
<text name="NextOwnerLabel">
|
||||
El Próximo propietario puede:
|
||||
</text>
|
||||
<check_box label="Modificar" name="next_owner_modify"/>
|
||||
<check_box label="Copiar" name="next_owner_copy"/>
|
||||
<check_box label="Venderlo/Darlo" name="next_owner_transfer"/>
|
||||
<check_box label="Modificarlo" name="next_owner_modify"/>
|
||||
<check_box label="Copiarlo" name="next_owner_copy"/>
|
||||
<check_box label="Transferirlo" name="next_owner_transfer"/>
|
||||
</panel>
|
||||
<button label="OK" label_selected="OK" name="ok"/>
|
||||
<button label="Cancelar" label_selected="Cancelar" name="cancel"/>
|
||||
|
||||
@@ -1,9 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="Snapshot" title="Vista Previa de la foto">
|
||||
<text name="file_size_label" right="-26" width="140">
|
||||
Tamaño de Archivo: [SIZE] KB
|
||||
</text>
|
||||
<text name="type_label">
|
||||
Destino de la foto
|
||||
Destino
|
||||
</text>
|
||||
<radio_group label="Tipo de foto" name="snapshot_type_radio">
|
||||
<radio_item name="feed">
|
||||
Publicar en my.secondlife.com
|
||||
</radio_item>
|
||||
<radio_item name="postcard">
|
||||
Enviar por Email
|
||||
</radio_item>
|
||||
@@ -14,10 +20,9 @@
|
||||
Guardarla en disco duro
|
||||
</radio_item>
|
||||
</radio_group>
|
||||
<text name="file_size_label">
|
||||
Tamaño del Archivo: [SIZE] KB
|
||||
</text>
|
||||
<button label="Actualizar foto" name="new_snapshot_btn"/>
|
||||
<button label="Congelar" name="freeze_time_btn" tool_tip="Congelar la imagen y mostrar la vista previa en pantalla completa. Permite mover la cámara por la escena congelada y tomar múltiples fotos de la misma. ¡Presiona ESC para deshacer!" />
|
||||
<button label="Publicar" name="feed_btn"/>
|
||||
<button label="Enviar" name="send_btn"/>
|
||||
<button label="Guardar ([UPLOADFEE])" name="upload_btn"/>
|
||||
<flyout_button label="Guardar" name="save_btn" tool_tip="Guardar la imagen en un archivo">
|
||||
@@ -28,75 +33,45 @@
|
||||
Guardar Como...
|
||||
</flyout_button_item>
|
||||
</flyout_button>
|
||||
<button label="Cancelar" name="discard_btn"/>
|
||||
<button label="Más >>" name="more_btn" tool_tip="Opciones Avanzadas"/>
|
||||
<button label="<< Menos" name="less_btn" tool_tip="Opciones Avanzadas"/>
|
||||
<button label="Cancelar" name="discard_btn"/>
|
||||
<button label="Más>>" name="more_btn" tool_tip="Opciones Avanzadas."/>
|
||||
<button label="<<Menos" name="less_btn" tool_tip="Opciones Avanzadas."/>
|
||||
<text name="type_label2">
|
||||
Tamaño
|
||||
Resolución Destino
|
||||
</text>
|
||||
<text name="format_label">
|
||||
Formato
|
||||
</text>
|
||||
</text>
|
||||
<combo_box label="Resolución" name="feed_size_combo">
|
||||
<combo_item name="CurrentWindow">
|
||||
Ventana Actual
|
||||
</combo_item>
|
||||
<combo_item name="Custom">
|
||||
Personalizado
|
||||
</combo_item>
|
||||
</combo_box>
|
||||
<!-- ========================== -->
|
||||
<combo_box label="Resolución" name="postcard_size_combo">
|
||||
<combo_item name="CurrentWindow">
|
||||
Ventana Actual
|
||||
</combo_item>
|
||||
<combo_item name="640x480">
|
||||
640x480
|
||||
</combo_item>
|
||||
<combo_item name="800x600">
|
||||
800x600
|
||||
</combo_item>
|
||||
<combo_item name="1024x768">
|
||||
1024x768
|
||||
</combo_item>
|
||||
<combo_item name="Custom">
|
||||
Personalizado
|
||||
</combo_item>
|
||||
</combo_box>
|
||||
<!-- ========================== -->
|
||||
<combo_box label="Resolución" name="texture_size_combo">
|
||||
<combo_item name="CurrentWindow">
|
||||
Ventana Actual
|
||||
</combo_item>
|
||||
<combo_item name="Small(128x128)">
|
||||
Pequeño (128x128)
|
||||
</combo_item>
|
||||
<combo_item name="Medium(256x256)">
|
||||
Medio (256x256)
|
||||
</combo_item>
|
||||
<combo_item name="Large(512x512)">
|
||||
Alto (512x512)
|
||||
</combo_item>
|
||||
<combo_item name="Custom">
|
||||
Personalizado
|
||||
</combo_item>
|
||||
</combo_box>
|
||||
<!-- ========================== -->
|
||||
<combo_box label="Resolución" name="local_size_combo">
|
||||
<combo_item name="CurrentWindow">
|
||||
Ventana Actual
|
||||
</combo_item>
|
||||
<combo_item name="320x240">
|
||||
320x240
|
||||
</combo_item>
|
||||
<combo_item name="640x480">
|
||||
640x480
|
||||
</combo_item>
|
||||
<combo_item name="800x600">
|
||||
800x600
|
||||
</combo_item>
|
||||
<combo_item name="1024x768">
|
||||
1024x768
|
||||
</combo_item>
|
||||
<combo_item name="1280x1024">
|
||||
1280x1024
|
||||
</combo_item>
|
||||
<combo_item name="1600x1200">
|
||||
1600x1200
|
||||
</combo_item>
|
||||
<combo_item name="Custom">
|
||||
Personalizado
|
||||
</combo_item>
|
||||
</combo_box>
|
||||
<!-- ========================== -->
|
||||
<combo_box label="Formato" name="local_format_combo">
|
||||
<combo_item name="PNG">
|
||||
PNG
|
||||
@@ -110,8 +85,53 @@
|
||||
</combo_box>
|
||||
<spinner label="Ancho" name="snapshot_width"/>
|
||||
<spinner label="Alto" name="snapshot_height"/>
|
||||
<check_box label="Mantener Proporciones" name="keep_aspect_check" />
|
||||
<slider label="Calidad de la Imagen" name="image_quality_slider"/>
|
||||
<slider label="Calidad de Imagen" left="10"
|
||||
name="image_quality_slider" width="210" />
|
||||
<check_box label="Mantener relación de aspecto"
|
||||
left="10" name="keep_aspect" tool_tip="Nota: definiendo la resolución a no Personalizada, o el aspecto al prestablecido reiniciará esta casilla de verificación ya que ambos con incompatibles entre si." />
|
||||
<text name="type_label3"/>
|
||||
<combo_box label="Aspecto" name="feed_aspect_combo">
|
||||
<combo_item name="Default">
|
||||
Predeterminado
|
||||
</combo_item>
|
||||
<combo_item name="Custom">
|
||||
Personalizado
|
||||
</combo_item>
|
||||
</combo_box>
|
||||
<combo_box label="Aspecto" name="postcard_aspect_combo">
|
||||
<combo_item name="Default">
|
||||
Predeterminado
|
||||
</combo_item>
|
||||
<combo_item name="Custom">
|
||||
Personalizado
|
||||
</combo_item>
|
||||
</combo_box>
|
||||
<combo_box label="Aspect" name="texture_aspect_combo">
|
||||
<combo_item name="CurrentWindow">
|
||||
Ventana Actual
|
||||
</combo_item>
|
||||
<combo_item name="4:3">
|
||||
4:3 (perfil)
|
||||
</combo_item>
|
||||
<combo_item name="Custom" value="-1">
|
||||
Personalizado
|
||||
</combo_item>
|
||||
</combo_box>
|
||||
<combo_box label="Aspecto" name="local_aspect_combo">
|
||||
<combo_item name="Default">
|
||||
Predeterminado
|
||||
</combo_item>
|
||||
<combo_item name="CurrentWindow">
|
||||
Ventana Actual
|
||||
</combo_item>
|
||||
<combo_item name="4:3">
|
||||
4:3 (perfil)
|
||||
</combo_item>
|
||||
<combo_item name="Custom" value="-1">
|
||||
Personalizado
|
||||
</combo_item>
|
||||
</combo_box>
|
||||
<spinner label="" name="aspect_ratio"/>
|
||||
<text name="layer_type_label">
|
||||
Captura:
|
||||
</text>
|
||||
@@ -123,14 +143,21 @@
|
||||
Profundidad
|
||||
</combo_item>
|
||||
</combo_box>
|
||||
<check_box label="Incluir la interfaz en la foto" name="ui_check"/>
|
||||
<check_box label="Incluir HUDs en la foto" name="hud_check"/>
|
||||
<check_box label="Incluir la interfaz en la foto" name="ui_check" tool_tip="Muestra la Interfaz en la foto. Esto impone que la resolución de la captura sea la de la ventana actual."/>
|
||||
<check_box label="Incluir HUDs en la foto" name="hud_check" tool_tip="Muestra los HUDs en la foto. Esto impone que la resolución de la captura sea la de la ventana actual."/>
|
||||
<check_box label="Mantener abierto tras guardar" name="keep_open_check"/>
|
||||
<check_box label="Congelar toma (Vista Previa en Pant. Completa)" name="freeze_frame_check"/>
|
||||
<check_box label="Actualizar Automáticamente" name="auto_snapshot_check"/>
|
||||
<check_box label="Imagen Temporal (Gratis)" name="temp_check" tooltip="Definir en los activos que es una imagen temporaria, lo que signfica que será gratis, pero también que su existencia será limitada."/>
|
||||
<check_box label="Abrir Flotante en Modo Congelar"
|
||||
left="10" name="freeze_time_check" tool_tip="Esta opción te permite rápidamente, presionando las teclas Ctrl+Mayús+S y congelar la imagen y tomarte tu tiempo para buscar y elegir la posición de la cámara e, incluso, tomar distintas tomas de la escena congelada." />
|
||||
<check_box label="Actualizar Automáticamente" name="auto_snapshot_check" tool_tip="En conjunto con la función Congelar: crea una nueva vista previa a pantalla completa cada vez que detienes la cámara."/>
|
||||
<check_box label="Imagen Temporal (Gratis)" name="temp_check" tool_tip="Definir en los activos que es una imagen temporaria, lo que signfica que será gratis, pero también que su existencia será limitada. (Puede no funcionar en el grid de SL)"/>
|
||||
<string name="unknown">
|
||||
desconocido
|
||||
</string>
|
||||
<string name="targetAR">
|
||||
Aspecto Destino
|
||||
</string>
|
||||
<string name="sourceAR">
|
||||
Aspecto Resolución y Destino
|
||||
</string>
|
||||
</floater>
|
||||
|
||||
@@ -13,26 +13,26 @@
|
||||
|
||||
<check_box label="Zoom" name="radio zoom"/>
|
||||
<check_box label="Órbita (Ctrl)" name="radio orbit"/>
|
||||
<check_box label="Panorámica (Ctrl-Shift)" name="radio pan"/>
|
||||
<check_box label="Panorámica (Ctrl-Mayús)" name="radio pan"/>
|
||||
|
||||
<!-- Move panel -->
|
||||
|
||||
<check_box label="Mover" name="radio move"/>
|
||||
<check_box label="Elevar (Ctrl)" name="radio lift"/>
|
||||
<check_box label="Rotar (Ctrl-Shift)" name="radio spin"/>
|
||||
<check_box label="Rotar (Ctrl-Mayús)" name="radio spin"/>
|
||||
|
||||
<!-- Edit panel -->
|
||||
<check_box label="Posición" name="radio position"/>
|
||||
<check_box label="Girar (Ctrl)" name="radio rotate"/>
|
||||
<check_box label="Estirar (Ctrl-Shift)" name="radio stretch"/>
|
||||
<check_box label="Estirar (Ctrl-Mayús)" name="radio stretch"/>
|
||||
<check_box label="Elegir Cara" name="radio select face"/>
|
||||
<check_box label="Alinear (Ctrl-A)" name="radio align"/>
|
||||
<check_box label="Editar partes enlazadas" name="checkbox edit linked parts"/>
|
||||
<text name="text ruler mode">
|
||||
Regla:
|
||||
</text>
|
||||
<combo_box name="combobox grid mode">
|
||||
<combo_item name="World" value="World">
|
||||
<combo_box name="combobox grid mode" left_delta="35">
|
||||
<combo_item name="World">
|
||||
Mundo
|
||||
</combo_item>
|
||||
<combo_item name="Local">
|
||||
@@ -44,8 +44,8 @@
|
||||
</combo_box>
|
||||
<check_box label="Estirar ambos lados" name="checkbox uniform"/>
|
||||
<check_box label="Estirar Texturas" name="checkbox stretch textures"/>
|
||||
<check_box label="Limitar dist. Arrastre" name="checkbox limit drag distance"/>
|
||||
<check_box label="Editar Ejes Raíz" name="checkbox actual root"/>
|
||||
<check_box label="Limitar Dist. Arrastre" name="checkbox limit drag distance"/>
|
||||
<check_box label="Editar Ejes en Raíz" name="checkbox actual root"/>
|
||||
<check_box label="Mostrar Resaltado" name="checkbox show highlight"/>
|
||||
<check_box label="Usar Cuadrícula" name="checkbox snap to grid"/>
|
||||
<button label="Opciones..." label_selected="Opciones..." name="Options..."/>
|
||||
@@ -154,8 +154,12 @@
|
||||
Transferir
|
||||
</string>
|
||||
<button label="Transferir..." label_selected="Transferir..." name="button deed" tool_tip="Los objetos compartidos por el grupo pueden ser transferidos por un oficial del grupo."/>
|
||||
<check_box label="Permitir que cualquiera lo mueva" name="checkbox allow everyone move"/>
|
||||
<check_box label="Permitir a cualquiera copiarlo" name="checkbox allow everyone copy"/>
|
||||
<text name="text anyone can">
|
||||
Cualquiera puede:
|
||||
</text>
|
||||
<check_box label="Moverlo" name="checkbox allow everyone move"/>
|
||||
<check_box label="Copiarlo" name="checkbox allow everyone copy"/>
|
||||
<check_box name="checkbox allow export" label="Exportarlo"/>
|
||||
<check_box label="Mostrar en la Búsqueda" name="search_check" tool_tip="Permitir que este objeto aparezca en los resultados de la búsqueda"/>
|
||||
<check_box label="En Venta" name="checkbox for sale"/>
|
||||
<text name="Cost">
|
||||
@@ -177,13 +181,12 @@
|
||||
</text>
|
||||
<check_box label="Modificarlo" name="checkbox next owner can modify"/>
|
||||
<check_box label="Copiarlo" name="checkbox next owner can copy"/>
|
||||
<check_box label="Revenderlo/Darlo" name="checkbox next owner can transfer"/>
|
||||
<check_box label="Transferirlo" name="checkbox next owner can transfer"/>
|
||||
<text name="label click action">
|
||||
Al pulsarlo con botón izquierdo:
|
||||
</text>
|
||||
<combo_box name="clickaction">
|
||||
<!-- Do not reorder these items, the index numbers are
|
||||
used internally. JC -->
|
||||
<!-- Do not reorder these items, the index numbers are used internally. JC -->
|
||||
<combo_item name="Touch/grab(default)">
|
||||
Tocar/Agarrar (Por Defecto)
|
||||
</combo_item>
|
||||
@@ -210,9 +213,6 @@
|
||||
<text name="B:">
|
||||
B:
|
||||
</text>
|
||||
<text name="O:">
|
||||
O;
|
||||
</text>
|
||||
<text name="G:">
|
||||
G:
|
||||
</text>
|
||||
@@ -225,13 +225,13 @@
|
||||
<text name="F:">
|
||||
F:
|
||||
</text>
|
||||
<!-- ======================== -->
|
||||
<!-- ======================= -->
|
||||
<panel name="pathfinding_attrs_panel">
|
||||
<text name="pathfinding_attributes_label">
|
||||
Atributos de Pathfinding:
|
||||
</text>
|
||||
<text name="pathfinding_attributes_value">
|
||||
Test
|
||||
Prueba
|
||||
</text>
|
||||
</panel>
|
||||
<string name="text modify info 1">
|
||||
@@ -529,7 +529,7 @@
|
||||
|
||||
<texture_picker label="" name="light texture control" tool_tip="Pulsa para escoger una proyección de imagen (sólo tiene efecto con el renderizado diferido activado"/>
|
||||
<spinner label="Intensidad" name="Light Intensity" label_width="55"/>
|
||||
<spinner label="CDV" name="Light FOV"/>
|
||||
<spinner label="FOV" name="Light FOV"/>
|
||||
<spinner label="Radio" name="Light Radius" label_width="55"/>
|
||||
<spinner label="Visión" name="Light Focus"/>
|
||||
<spinner label="Atenuación" name="Light Falloff" label_width="55"/>
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="floater_vfs" title="Activos Locales">
|
||||
</floater>
|
||||
@@ -1,3 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="floater_vfs" title="Explorador del VFS">
|
||||
</floater>
|
||||
@@ -7,7 +7,7 @@
|
||||
<menu_item_call name="Task Rename" label="Renombrar"/>
|
||||
<menu_item_call name="Task Remove" label="Borrar"/>
|
||||
<menu_item_call name="Empty Trash" label="Vaciar Papelera"/>
|
||||
<menu_item_call name="Empty Lost And Found" label="Vaciar Perdidos y Encontrados"/>
|
||||
<menu_item_call name="Empty Lost And Found" label="Vaciar Elementos Perdidos"/>
|
||||
<menu_item_call name="New Folder" label="Carpeta nueva"/>
|
||||
<menu_item_call name="New Script" label="Script nuevo"/>
|
||||
<menu_item_call name="New Note" label="Nota nueva"/>
|
||||
@@ -32,7 +32,7 @@
|
||||
<menu_item_call name="New Hair" label="Pelo nuevo"/>
|
||||
<menu_item_call name="New Eyes" label="Ojos nuevos"/>
|
||||
</menu>
|
||||
<menu_item_call name="Landmark Open" label="Teleport"/>
|
||||
<menu_item_call name="Landmark Open" label="Teleportar"/>
|
||||
<menu_item_call name="Animation Open" label="Abrir"/>
|
||||
<menu_item_call name="Sound Open" label="Abrir"/>
|
||||
<menu_item_call name="Find Original" label="Encontrar original"/>
|
||||
@@ -46,15 +46,15 @@
|
||||
<menu_item_call name="Open" label="Abrir"/>
|
||||
<menu_item_call name="Properties" label="Propiedades"/>
|
||||
<menu_item_call name="Rename" label="Renombrar"/>
|
||||
<menu_item_call name="Copy Asset UUID" label="Copiar Asset UUID"/>
|
||||
<menu_item_call name="Acquire Asset ID" label="Adquirir Asset ID"/>
|
||||
<menu_item_call name="Copy Asset UUID" label="Copiar UUID de Asset"/>
|
||||
<menu_item_call name="Acquire Asset ID" label="Obtener ID de Asset"/>
|
||||
<menu_item_call name="Cut" label="Cortar"/>
|
||||
<menu_item_call name="Copy" label="Copiar"/>
|
||||
<menu_item_call name="Paste" label="Pegar"/>
|
||||
<menu_item_call name="Paste As Copy" label="Pegar como Copia"/>
|
||||
<menu_item_call name="Paste As Link" label="Pegar como Link"/>
|
||||
<menu_item_call name="Paste As Link" label="Pegar como Enlace"/>
|
||||
<menu_item_call name="Restore to Last Position" label="Restaurar en el mundo"/>
|
||||
<menu_item_call name="Remove Link" label="Borrar Link"/>
|
||||
<menu_item_call name="Remove Link" label="Borrar Enlace"/>
|
||||
<menu_item_call name="Delete" label="Borrar"/>
|
||||
<menu_item_call name="Wear Items" label="Vestirse objetos"/>
|
||||
<menu_item_call name="Add To Outfit" label="Añadir al vestuario"/>
|
||||
@@ -66,7 +66,7 @@
|
||||
<menu_item_call name="Animation Play" label="Reproducir en el mundo"/>
|
||||
<menu_item_call name="Animation Audition" label="Reproducir localmente" />
|
||||
<menu_item_call name="Send Instant Message" label="Enviar MI"/>
|
||||
<menu_item_call name="Offer Teleport..." label="Ofrecer Teleport..."/>
|
||||
<menu_item_call name="Offer Teleport..." label="Ofrecer Teleporte..."/>
|
||||
<menu_item_call name="Conference Chat" label="Iniciar Conferencia Grupal"/>
|
||||
<menu_item_call name="Activate" label="Activar"/>
|
||||
<menu_item_call name="Deactivate" label="Desactivar"/>
|
||||
|
||||
@@ -1,47 +1,30 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<pie_menu name="Attachment Pie">
|
||||
<menu_item_call label="Perfil..." name="Profile...">
|
||||
<on_click function="ShowAgentProfile" userdata="agent" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Soltar" name="Drop">
|
||||
<on_click function="Attachment.Drop" />
|
||||
<on_enable function="Attachment.EnableDrop" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Tocar" name="Attachment Object Touch">
|
||||
<on_click function="Object.Touch" />
|
||||
<on_enable function="Object.EnableTouch" userdata="Touch" name="EnableTouch"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Pararse" name="Stand Up">
|
||||
<on_click function="Self.StandUp" userdata="" />
|
||||
<on_enable function="Self.EnableStandUp" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Quitar" name="Detach">
|
||||
<on_click function="Attachment.Detach" />
|
||||
<on_enable function="Attachment.EnableDetach" />
|
||||
</menu_item_call>
|
||||
<pie_menu label="Herramientas >" name="Tools >">
|
||||
<menu_item_call label="S. Count" name="ScriptCount">
|
||||
<on_click function="Object.ScriptCount" />
|
||||
<on_visible function="Object.VisibleScriptCount" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Inspeccionar" name="Object Inspect">
|
||||
<on_click function="Object.Inspect" />
|
||||
<on_enable function="Object.EnableInspect"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Datos" name="Data">
|
||||
<on_click function="Object.Data" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Derender" name="Derender">
|
||||
<on_click function="Object.DERENDER" />
|
||||
<on_enable function="Object.EnableDerender" />
|
||||
</menu_item_call>
|
||||
</pie_menu>
|
||||
<menu_item_call label="Apariencia..." name="Appearance...">
|
||||
<on_click function="ShowFloater" userdata="appearance" />
|
||||
<on_enable function="Edit.EnableCustomizeAvatar" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Editar..." name="Edit...">
|
||||
<on_click function="Object.Edit" />
|
||||
<on_enable function="EnableEdit" />
|
||||
</menu_item_call>
|
||||
</pie_menu>
|
||||
<menu_item_call label="Perfil..." name="Profile..."/>
|
||||
<menu_item_call label="Soltar" name="Drop"/>
|
||||
<menu_item_call label="Tocar" name="Attachment Object Touch">
|
||||
<on_click function="Object.Touch" />
|
||||
<on_enable function="Object.EnableTouch" userdata="Tocar" name="EnableTouch"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Pararse" name="Stand Up">
|
||||
<on_click function="Self.SitOrStand"/>
|
||||
<on_enable function="Self.EnableSitOrStand" userdata="Sentarse,Pararse"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Quitar" name="Detach"/>
|
||||
<pie_menu label="Herramientas >" name="Tools >">
|
||||
<pie_menu label="Scripts >" name="ScriptsMenu">
|
||||
<menu_item_call label="Compilar en Mono" name="CompileMono"/>
|
||||
<menu_item_call label="Compilar en LSL" name="CompileLSL"/>
|
||||
<menu_item_call label="Reiniciar" name="Reset Scripts"/>
|
||||
<menu_item_call label="Iniciar" name="Object Set Scripts to Running"/>
|
||||
<menu_item_call label="Detener" name="Object Set Scripts to Not Running"/>
|
||||
<menu_item_call label="Borrar" name="Remove Scripts From Selection"/>
|
||||
<menu_item_call label="Conteo de Scripts" name="ScriptCount"/>
|
||||
</pie_menu>
|
||||
<menu_item_call label="Inspeccionar" name="Object Inspect"/>
|
||||
<menu_item_call label="Datos" name="Data"/>
|
||||
<menu_item_call label="Desdibujar" name="Derender"/>
|
||||
<menu_item_call label="Recargar" name="Reload Textures"/>
|
||||
</pie_menu>
|
||||
<menu_item_call label="Apariencia..." name="Appearance..."/>
|
||||
<menu_item_call label="Editar..." name="Edit..."/></pie_menu>
|
||||
|
||||
@@ -4,16 +4,17 @@
|
||||
<menu_item_call label="Silenciar" name="Avatar Mute"/>
|
||||
<menu_item_call label="Ir a" name="Go To"/>
|
||||
<menu_item_call label="Denunciar..." name="abuse"/>
|
||||
<menu_item_call label="Añadir como Amigo..." name="Add Friend"/>
|
||||
<menu_item_call label="Añadir Amigo..." name="Add Friend"/>
|
||||
<menu_item_call label="Pagar..." name="Pay..."/>
|
||||
<pie_menu label="Más >" name="More >">
|
||||
<menu_item_call label="Congelar..." name="Freeze..."/>
|
||||
<menu_item_call label="Dar Tarjeta" name="Give Card"/>
|
||||
<menu_item_call label="Invitar a Grupo..." name="Invite..."/>
|
||||
<pie_menu label="Herramientas >" name="Tools >">
|
||||
<menu_item_call label="Contar Scripts" name="ScriptCount"/>
|
||||
<menu_item_call label="Copiar UUID" name="CopyUUID"/>
|
||||
<menu_item_call label="ID Cliente" name="ClientID"/>
|
||||
<menu_item_call label="Derenderizar" name="Derender"/>
|
||||
<menu_item_call label="Desdibujar" name="Derender"/>
|
||||
<menu_item_call label="Recargar" name="Reload Textures"/>
|
||||
</pie_menu>
|
||||
<menu_item_call label="Expulsar..." name="Eject..."/>
|
||||
|
||||
@@ -1,29 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<pie_menu name="Land Pie">
|
||||
<menu_item_call label="Sobre el terreno..." name="About Land...">
|
||||
<on_click function="ShowFloater" userdata="about land" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Crear" name="Create">
|
||||
<on_click function="Land.Build" />
|
||||
<on_enable function="EnableEdit" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Ir aquí" name="Go Here">
|
||||
<on_click function="GoToObject" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Sentarse aquí" name="Sit Here">
|
||||
<on_click function="Land.Sit" />
|
||||
</menu_item_call>
|
||||
<menu_item_separator />
|
||||
<menu_item_call label="Comprar pase..." name="Land Buy Pass">
|
||||
<on_click function="Land.BuyPass" />
|
||||
<on_enable function="Land.EnableBuyPass" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Editar terreno" name="Edit Terrain">
|
||||
<on_click function="Land.Edit" />
|
||||
<on_enable function="EnableEdit" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Comprar Terreno..." name="Land Buy">
|
||||
<on_click function="ShowFloater" userdata="buy land" />
|
||||
<on_enable function="World.EnableBuyLand" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Sobre el terreno..." name="About Land..."/>
|
||||
<menu_item_call label="Crear" name="Create"/>
|
||||
<menu_item_call label="Ir aquí" name="Go Here"/>
|
||||
<menu_item_call label="Sentarse aquí" name="Sit Here"/>
|
||||
<menu_item_call label="Comprar pase..." name="Land Buy Pass"/>
|
||||
<menu_item_call label="Editar terreno" name="Edit Terrain"/>
|
||||
<menu_item_call label="Comprar Terreno..." name="Land Buy"/>
|
||||
</pie_menu>
|
||||
|
||||
@@ -2,9 +2,17 @@
|
||||
<pie_menu name="Object Pie">
|
||||
<menu_item_call label="Abrir" name="Open"/>
|
||||
<menu_item_call label="Crear" name="Create"/>
|
||||
<menu_item_call label="Tocar" name="Object Touch"/>
|
||||
<menu_item_call label="Sentarse" name="Object Sit"/>
|
||||
<menu_item_call label="Recoger" name="Pie Object Take"/>
|
||||
<menu_item_call label="Tocar" name="Object Touch">
|
||||
<on_click function="Object.Touch" />
|
||||
<on_enable function="Object.EnableTouch" userdata="Tocar" name="EnableTouch"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Sentarse" name="Object Sit">
|
||||
<on_click function="Object.SitOrStand"/>
|
||||
<on_enable function="Object.EnableSitOrStand" userdata="Sentarse,Pararse" name="EnableSitOrStand"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Recoger" name="Pie Object Take">
|
||||
<on_enable function="Tools.EnableBuyOrTake" userdata="Comprar,Recoger" name="EnableBuyOrTake"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Pagar..." name="Pay..."/>
|
||||
<pie_menu label="Más >" name="More >">
|
||||
<menu_item_call label="Borrar" name="Delete"/>
|
||||
@@ -15,20 +23,32 @@
|
||||
<menu_item_call label="Regresar..." name="Return..."/>
|
||||
<pie_menu label="Más >" name="Rate Menu">
|
||||
<pie_menu label="Herramientas >" name="Rate Menu">
|
||||
<menu_item_call label="Destruir" name="Destroy"/>
|
||||
<menu_item_call label="Explotar" name="Explode"/>
|
||||
<menu_item_call label="Medir" name="Measure"/>
|
||||
<menu_item_call label="Información" name="Data"/>
|
||||
<menu_item_call label="Contar Scripts" name="ScriptCount"/>
|
||||
<menu_item_call label="Reiniciar Scripts" name="Reset Scripts"/>
|
||||
<menu_item_call label="Exportar" name="Export"/>
|
||||
<menu_item_call label="Recargar" name="Reload Textures"/>
|
||||
</pie_menu>
|
||||
<menu_item_call label="Recargar" name="Reload Textures"/>
|
||||
<menu_item_call label="Silenciar" name="Object Mute"/>
|
||||
<menu_item_call label="Examinar" name="Object Inspect"/>
|
||||
<menu_item_call label="Derenderizar" name="Derender"/>
|
||||
<menu_item_call label="Desdibujar" name="Derender"/>
|
||||
<menu_item_call label="Denunciar..." name="Report Abuse..."/>
|
||||
<pie_menu label="Pathfinding >" name="PF Menu">
|
||||
<menu_item_call label="Mostrar e/Conj.Enlaces" name="show_in_linksets"/>
|
||||
<menu_item_call label="Mostrar en Personajes" name="show_in_characters"/>
|
||||
</pie_menu>
|
||||
<pie_menu label="Scripts >" name="ScriptsMenu">
|
||||
<menu_item_call label="Compilar Mono" name="CompileMono"/>
|
||||
<menu_item_call label="Compilar LSL" name="CompileLSL"/>
|
||||
<menu_item_call label="Reiniciar" name="Reset Scripts"/>
|
||||
<menu_item_call label="Ejecutar" name="Object Set Scripts to Running"/>
|
||||
<menu_item_call label="Detener" name="Object Set Scripts to Not Running"/>
|
||||
<menu_item_call label="Borrar" name="Remove Scripts From Selection"/>
|
||||
<menu_item_call label="Contar Scripts" name="ScriptCount"/>
|
||||
</pie_menu>
|
||||
</pie_menu>
|
||||
<menu_item_call label="Comprar..." name="Buy..."/>
|
||||
</pie_menu>
|
||||
<menu_item_call label="Comprar..." name="Buy..."/>
|
||||
</pie_menu>
|
||||
<menu_item_call label="Editar..." name="Edit..."/>
|
||||
</pie_menu>
|
||||
|
||||
@@ -21,15 +21,21 @@
|
||||
<menu_item_call label="Falda" name="Skirt"/>
|
||||
</pie_menu>
|
||||
<pie_menu label="HUD >" name="Object Detach HUD"/>
|
||||
<pie_menu enabled="true" label="Quitar >" name="Object Detach" />
|
||||
<pie_menu label="Quitar >" name="Object Detach" />
|
||||
<menu_item_call label="Quitar todo" name="Detach All"/>
|
||||
</pie_menu>
|
||||
<pie_menu label="Herramientas >" name="Tools >">
|
||||
<menu_item_call label="Recargar" name="Reload Textures"/>
|
||||
<menu_item_call label="Animaciones..." name="Anims..."/>
|
||||
<menu_item_call label="Contar Scripts" name="ScriptCount"/>
|
||||
<menu_item_call label="Info de Script" name="Script Info"/>
|
||||
<menu_item_call label="Depurar..." name="Debug Layers"/>
|
||||
<menu_item_call label="Copiar UUID" name="CopyUUID"/>
|
||||
</pie_menu>
|
||||
<menu_item_call label="Pararse" name="Stand Up Self">
|
||||
<on_click function="Self.SitOrStand"/>
|
||||
<on_enable function="Self.EnableSitOrStand" userdata="Sentarse,Pararse"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Gestos..." name="Gestures..."/>
|
||||
<menu_item_call label="Apariencia..." name="Appearance..."/>
|
||||
</pie_menu>
|
||||
|
||||
@@ -4,14 +4,16 @@
|
||||
<menu_item_call label="Imagen ([UPLOADFEE])..." name="Upload Image"/>
|
||||
<menu_item_call label="Sonido ([UPLOADFEE])..." name="Upload Sound"/>
|
||||
<menu_item_call label="Animación ([UPLOADFEE])..." name="Upload Animation"/>
|
||||
<menu_item_call label="Subir Malla..." name="Upload Mesh"/>
|
||||
<menu_item_call label="Masiva ([UPLOADFEE] por archivo)..." name="Bulk Upload"/>
|
||||
<menu_item_call label="Importar XML" name="Import"/>
|
||||
<menu_item_call label="Importar con Texturas" name="Import2"/>
|
||||
<menu_item_call label="Cambiar Texturas Locales" name="Change Local Textures"/>
|
||||
<menu_item_call label="Definir Permisos por Defecto..." name="perm prefs"/>
|
||||
<menu_item_call label="Minimizar todas las Ventanas" name="Minimize All Windows"/>
|
||||
<menu_item_call label="Cerrar Ventana" name="Close Window"/>
|
||||
<menu_item_call label="Cerrar todas las Ventanas" name="Close All Windows"/>
|
||||
<menu_item_separator label="-----------" name="separator2"/>
|
||||
<menu_item_call label="Guardar Vista Previa Como..." name="Save Preview As..."/>
|
||||
<menu_item_call label="Guardar Vista Previa Como (TGA)..." name="Save Preview As..."/>
|
||||
<menu_item_call label="Guardar Vista Previa Como (PNG)..." name="Save Preview AsPNG..."/>
|
||||
<menu_item_call label="Hacer una Foto" name="Take Snapshot"/>
|
||||
<menu_item_call label="Guardar Foto en Disco" name="Snapshot to Disk"/>
|
||||
@@ -65,7 +67,7 @@
|
||||
<menu_item_call label="Mirar al último que habló" name="Look at Last Chatter"/>
|
||||
<menu_item_check label="Barra de Herramientas" name="Toolbar"/>
|
||||
<menu_item_check label="Chat Local" name="Chat History"/>
|
||||
<menu_item_check label="Comunicarse" name="Instant Message"/>
|
||||
<menu_item_check label="Comunicación" name="Instant Message"/>
|
||||
<menu_item_check label="Inventario" name="Inventory"/>
|
||||
<menu_item_check label="Participantes Activos" name="Active Speakers"/>
|
||||
<menu_item_check label="Lista de Ignorados" name="Mute List"/>
|
||||
@@ -74,7 +76,7 @@
|
||||
<menu_item_check label="Controles de Cámara" name="Camera Controls"/>
|
||||
<menu_item_check label="Controles de Movimiento" name="Movement Controls"/>
|
||||
<menu_item_check label="Mapa del Mundo" name="World Map"/>
|
||||
<menu_item_check label="MiniMapa" name="Mini-Map"/>
|
||||
<menu_item_check label="Mini Mapa" name="Mini-Map"/>
|
||||
<menu_item_check label="Radar" name="Radar"/>
|
||||
<menu_item_check label="Estadísticas" name="Statistics Bar"/>
|
||||
<menu_item_check label="Búsqueda en Área" name="Area Search"/>
|
||||
@@ -90,11 +92,9 @@
|
||||
<menu_item_check name="beacons" label="Balizas"/>
|
||||
<menu_item_check label="Ocultar Partículas" name="Hide Particles"/>
|
||||
<menu_item_check label="Mostrar los HUD en uso" name="Show HUD Attachments"/>
|
||||
<menu_item_separator label="-----------" name="separator5"/>
|
||||
<menu_item_call label="Acercar Zoom" name="Zoom In"/>
|
||||
<menu_item_call label="Zoom Predeterminado" name="Zoom Default"/>
|
||||
<menu_item_call label="Alejar Zoom" name="Zoom Out"/>
|
||||
<menu_item_separator label="-----------" name="separator6" />
|
||||
<menu_item_call label="Pantalla Completa" name="Toggle Fullscreen"/>
|
||||
<menu_item_call label="Interfaz en tamaño Predeterminado" name="Set UI Size to Default"/>
|
||||
</menu>
|
||||
@@ -106,7 +106,7 @@
|
||||
<menu_item_check label="Volar" name="Fly"/>
|
||||
<menu_item_call label="Crear un Hito Aquí" name="Create Landmark Here"/>
|
||||
<menu_item_call label="Fijar Base Aquí" name="Set Home to Here"/>
|
||||
<menu_item_call label="Teleport a Base" name="Teleport Home"/>
|
||||
<menu_item_call label="Teleportar a Base" name="Teleport Home"/>
|
||||
<menu_item_call label="Falso Estado Ausente" name="Fake Away Status"/>
|
||||
<menu_item_call label="Pasar a Estado Ausente" name="Set Away"/>
|
||||
<menu_item_call label="Pasar a Estado Ocupado" name="Set Busy"/>
|
||||
@@ -116,6 +116,8 @@
|
||||
<menu_item_call label="Administrar mi Cuenta..." name="Manage My Account..."/>
|
||||
<menu_item_check label="Buzón de Salida de Comerciante..." name="MerchantOutbox"/>
|
||||
<menu_item_call label="Comprar [CURRENCY]..." name="Buy and Sell L$..."/>
|
||||
<menu_item_call label="Mis Vestuarios" name="My Outfits"/>
|
||||
<menu_item_call label="Favoritos" name="Favorites"/>
|
||||
<menu_item_call label="Mi Terreno..." name="My Land..."/>
|
||||
<menu_item_call label="Acerca del Terreno..." name="About Land..."/>
|
||||
<menu_item_call label="Comprar Terreno..." name="Buy Land..."/>
|
||||
@@ -148,12 +150,12 @@
|
||||
<menu_item_check label="Mostrar radio de luz de la selección" name="Show Light Radius for Selection"/>
|
||||
<menu_item_check label="Mostrar rayo indicador" name="Show Selection Beam"/>
|
||||
<menu_item_check label="Ajustar a la cuadrícula" name="Snap to Grid"/>
|
||||
<menu_item_call label="Ajustar Objetos a los Ejes XY de la cuadrícula" name="Snap Object XY to Grid"/>
|
||||
<menu_item_call label="Ajustar Objetos XY a la cuadrícula" name="Snap Object XY to Grid"/>
|
||||
<menu_item_call label="Usar Seleccionado como cuadrícula" name="Use Selection for Grid"/>
|
||||
<menu_item_call label="Opciones de la Cuadrícula..." name="Grid Options..."/>
|
||||
<menu_item_check label="Editar partes enlazadas" name="Edit Linked Parts"/>
|
||||
<menu label="Seleccionar partes enlazadas" name="Select Linked Parts" >
|
||||
<menu_item_call label="Seleccionar parte siguiente" name="Select Next Part"/>
|
||||
<menu_item_call label="Seleccionar Parte Siguiente" name="Select Next Part"/>
|
||||
<menu_item_call label="Seleccionar Parte Anterior" name="Select Previous Part"/>
|
||||
<menu_item_call label="Incluir Parte Siguiente" name="Include Next Part"/>
|
||||
<menu_item_call label="Incluir Parte Anterior" name="Include Previous Part"/>
|
||||
@@ -162,10 +164,12 @@
|
||||
<menu_item_call label="Desenlazar" name="Unlink"/>
|
||||
<menu_item_call label="Foco en la Selección" name="Focus on Selection"/>
|
||||
<menu_item_call label="Zoom en lo Seleccionado" name="Zoom to Selection"/>
|
||||
<menu_item_call label="Comprar Objeto" name="Menu Object Take"/>
|
||||
<menu_item_call label="Agarrar una Copia" name="Take Copy"/>
|
||||
<menu_item_call label="Comprar Objeto" name="Menu Object Take">
|
||||
<on_enable function="Tools.EnableBuyOrTake" userdata="Comprar,Recoger" name="EnableBuyOrTake"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Recoger una Copia" name="Take Copy"/>
|
||||
<menu_item_call label="Devolver Objeto" name="Return..."/>
|
||||
<menu_item_call label="Devolver el Objeto al Contenido de Objetos" name="Save Object Back to Object Contents"/>
|
||||
<menu_item_call label="Devolver Objeto al Contenido de Objetos" name="Save Object Back to Object Contents"/>
|
||||
<menu_item_call label="Administrador - Borrar" name="Admin Delete"/>
|
||||
<menu_item_call label="Mostrar ventana de avisos/errores de Script " name="Show Script Warning/Error Window"/>
|
||||
<menu label="Recompilar Scripts de la Selección" name="Recompile Scripts in Selection">
|
||||
@@ -176,7 +180,11 @@
|
||||
<menu_item_call label="Definir Ejecución de Scripts en la Selección" name="Set Scripts to Running in Selection"/>
|
||||
<menu_item_call label="Definir la no ejecución de Scripts en la Selección" name="Set Scripts to Not Running in Selection"/>
|
||||
<menu_item_call label="Borrar Scripts en la Selección" name="Remove Scripts in Selection"/>
|
||||
<menu_item_call label="Rebake de Región" name="pathfinding_rebake_navmesh_item"/>
|
||||
<menu label="Pathfinding" name="Pathfinding">
|
||||
<menu_item_check label="Conjuntos de Enlaces..." name="pathfinding_linksets_menu_item"/>
|
||||
<menu_item_check label="Personajes..." name="pathfinding_characters_menu_item"/>
|
||||
<menu_item_call label="Rebake de Región" name="pathfinding_rebake_navmesh_item"/>
|
||||
</menu>
|
||||
</menu>
|
||||
<!-- =========================================== -->
|
||||
<menu label="Ayuda" left="227" name="Help" >
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -36,4 +36,7 @@
|
||||
<string name="server_forbidden_text">
|
||||
La información de esta ubicación no está disponible debido a la restricción de acceso. Por favor, verifica tus permisos con el propietario de la parcela.
|
||||
</string>
|
||||
<string name="internal_timeout_text">
|
||||
La información de esta ubicación no está disponible debido a que se ha agotado el tiempo de espera de la red, por favor, intenta de nuevo mas tarde.
|
||||
</string>
|
||||
</panel>
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
<check_box label="Ejecutar sonido de escritura en chat local" tool_tip="Silencia el sonido de escritura, haciendo que determinadas cosas sean mas tranquilas, como las actuaciones en vivo." name="play_typing_sound_check"/>
|
||||
<check_box label="No Mostrar/registrar notificaciones en chat" name="hide_notifications_in_chat_check"/>
|
||||
<check_box label="Mostrar nombre del grupo en el chat" tool_tip="El nombre del grupo también será mostrado si el MI es de un chat de grupo." name="append_group_name_check"/>
|
||||
<check_box label="Mostrar cambios en Nombres Mostrados" tool_tip="Estando marcado, se mostrará una notificación en el chat local cuando un residente en la misma región cambie su nombre a mostrar." name="display_name_change"/>
|
||||
<check_box label="Usar burbuja indicadora de escritura" name="use_typing_bubbles"/>
|
||||
<text name="objects_link_text_box3">
|
||||
Mostrar en el historial de chat links de chat de objetos para:
|
||||
</text>
|
||||
|
||||
@@ -89,6 +89,8 @@
|
||||
<check_box label="Captura silenciosa a Disco" tool_tip="Anula el sonido de la cámara y el alerta a los demás cuando realizas una captura al disco de tu PC" name="quiet_snapshots_check"/>
|
||||
<check_box label="Al pararse, revoca el permiso de los objetos en los cuales estuvo sentado tu avatar" tool_tip="Los objetos retienen, generalmente, el permiso para tomar control y ejecutar animaciones hasta que se reinician u otro usuario le cede permisos. Activando esta opción te aseguras que los permisos serán revocados inmediatamente." name="revoke_perms_on_stand_up_check"/>
|
||||
<check_box label="Desactivar click del ratón para sentarse en los objetos" tool_tip="Algunas herramientas de griefer se basan en forzarte o engañarte para que hagas click en un objeto el cual te hará sentar, dándole automáticamente al objeto permisos para ejecutar una animación entre de otras cosas. Esta opción desactivará la función llSitTarget - Esto significa que deberás seleccionar la opción 'Sentarse' en las bolas de animación o muebles." name="disable_click_sit_check"/>
|
||||
<check_box left_delta="280" label="Que no son de tu propiedad" tool_tip="Deshabilita sentarse con un click en objetos que no son de tu propiedad (Si se usa con control de grupo, sólo una opción es necesaria)" name="disable_click_sit_own_check"/>
|
||||
|
||||
<check_box label="Mostrar cambios del Total de Scripts en Ejecución:" name="totalscriptjumps" tool_tip="Muestra los cambios en la cuenta total de scritps en tu región, dependiendo del umbral que selecciones a la derecha."/>
|
||||
<spinner left_delta="350" name="ScriptJumpCount" tool_tip="Umbral para el mensaje de salto de scripts [Predeterminado: 100]"/>
|
||||
</panel>
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel label="Vanity" name="ascvan">
|
||||
<tab_container label="Singularity Vanity" name="Ascent Vanity">
|
||||
<panel label="Principal (General)" name="General">
|
||||
<panel label="General" name="General">
|
||||
<check_box label="Cuando sea aplicable, guardar Ajustes Vanity por cuenta." tool_tip="Guarda ajustes individuales por cuenta, permitiendo una mas fácil personalización de Alts." name="use_account_settings_check"/>
|
||||
<check_box label="Ocultar pantalla de progreso de Teleport" tool_tip="Activado, el visor ocultará la pantalla de progreso de Teleportación, pemitiendo leer MIs.." name="disable_tp_screen_check"/>
|
||||
<check_box label="Reproducir sonidos de teleport al cambiar de sim" tool_tip="El Visor reproducirá el sonido de trnasportación al hacer un teleport." name="tp_sound_check"/>
|
||||
<check_box label="Ocultar pantalla de progreso de Teleporte" tool_tip="Activado, el visor ocultará la pantalla de progreso de Teleportación, pemitiendo leer MIs.." name="disable_tp_screen_check"/>
|
||||
<check_box label="Reproducir sonidos de teleportación al cambiar de sim" tool_tip="El Visor reproducirá el sonido de trnasportación al hacer un teleporte." name="tp_sound_check"/>
|
||||
<check_box label="Ocultar la pantalla de inicio/cierre de sesión" tool_tip="Marcado, el visor ocultará la pantalla de progreso de inicio/cierre de sesión." name="disable_logout_screen_check"/>
|
||||
<check_box label="Desactivar animaciones de chat, susurro y gritos" tool_tip="Quitar las animaciones de tu avatar. El efecto es visible para todos" name="disable_chat_animation"/>
|
||||
<check_box label="Añadir ropa y objetos vestibles en vez de reemplazarlos" tool_tip="Cuando hagas doble click o presiones la tecla Entrar sobre ropas u objetos para vestir en tu inventario, los objetos seleccionados se agregarán a tu vestuario en vez de reemplazar a los que tengas vestidos en la misma ubicación" name="add_not_replace"/>
|
||||
<check_box label="Dar la vuelta al caminar hacía atrás" tool_tip="Es posible que algunos AOs puedan darte vuelta incluso con esta opción deshabiltada." name="turn_around"/>
|
||||
<check_box label="Dar la vuelta al caminar hacía atrás" tool_tip="Es posible que algunos AOs puedan darte vuelta incluso con esta opción deshabilitada." name="turn_around"/>
|
||||
<check_box label="Anunciar cuando alguien toma una foto" tool_tip="No avisa si el usuario ha deshabilitado en su visor el no anunciar que está tomando fotografías." name="announce_snapshots"/>
|
||||
<check_box label="Mostrar los metadatos de la música en stream en el chat local cuando es activada" tool_tip="Cuando comienza una nueva canción, se mostrará un mensaje en el chat local con la información disponible del tema." name="announce_stream_metadata"/>
|
||||
</panel>
|
||||
<panel label="Tags/Colores" name="TagsColors">
|
||||
<!-- Client tag options -->
|
||||
<check_box label="Usar Tag de Visor:" left="10" tool_tip="Activándolo mostrará el tag de tu visor, en forma local, sobre tu nombre de avatar." name="show_my_tag_check"/>
|
||||
<check_box label="Usar Tag de Visor:" left="10" tool_tip="Activándolo mostrará el tag de tu visor al resto de los usuarios." name="show_my_tag_check"/>
|
||||
<combo_box tool_tip="Tag del Visor ( Y colores subsecuentes) a transmitir. Sobreescribir en forma local por Tag/Colores personalizados." name="tag_spoofing_combobox">
|
||||
<combo_item name="Singularity" >
|
||||
Singularity
|
||||
@@ -25,7 +25,7 @@
|
||||
<check_box label="Ver tags de amigos como (Amigo)" tool_tip="Activándolo cambia el tag de cliente de tus amigos a (Amigo)." name="show_friend_tag_check"/>
|
||||
<!-- End of Left Side -->
|
||||
<check_box label="Usar color y etiqueta personalizadas (Sólo local)" tool_tip="Activándolo te permitirá ajustar tu tag de nombre para mostrar con tu tag de cliente y color personalizados. Esto sólo funciona para ti mismo." name="customize_own_tag_check"/>
|
||||
<text bottom_delta="-17" left_delta="25" follows="top" height="10" name="custom_tag_label_text">
|
||||
<text name="custom_tag_label_text">
|
||||
Etiqueta:
|
||||
</text>
|
||||
<line_editor left_delta="45" name="custom_tag_label_box" tool_tip="Texto personalizado que usarás para reemplazar el tag de tu visor (Sólo Local)"/>
|
||||
@@ -43,7 +43,7 @@
|
||||
Color para Mis Efectos:
|
||||
</text>
|
||||
<color_swatch label="Efectos" name="effect_color_swatch"/>
|
||||
<check_box label="Utilizar Color de Tipo de usuario (Amigo, Linden, etc.)" left="10" tool_tip="Activándolo mostrará con el color definido abajo a la gente que cumple con determinado criterio de tipo de usuario (Lindens, Propietarios de Estado, amigo, usuarios bloquedos)." name="use_status_check"/>
|
||||
<check_box label="Utilizar Color de Tipo de usuario (Amigo, Linden, etc.)" left="10" tool_tip="Activándolo mostrará con el color definido abajo a la gente que cumple con determinado criterio de tipo de usuario (Lindens, Propietarios de Estado, amigo, usuarios bloqueados)." name="use_status_check"/>
|
||||
<text name="friends_color_textbox">
|
||||
Color Para:
|
||||
(Radar, Tag, Minimap)
|
||||
@@ -62,19 +62,13 @@
|
||||
<check_box label="" name="color_muted_check" tool_tip="Color en Chat de Usuarios Ignorados"/>
|
||||
<!--check_box bottom_delta="0" control_name="ColorCustomChat" follows="top" height="20" label="" left_delta="54" name="color_custom_check" width="44" tool_tip="Color Custom Chat"/ Not implemented, yet.-->
|
||||
</panel>
|
||||
<panel label="Fiísica de Avatar" name="Body Dynamics">
|
||||
<check_box label="Activar física avanzada de los senos del avatar" name="EmBreastsToggle" tool_tip="Deberás seleccionar Aplicar para activar o desactivar estos controles"/>
|
||||
<slider name="EmeraldBoobMass" label="Masa del Seno:"/>
|
||||
<slider name="EmeraldBoobHardness" label="Rebote de Seno:" />
|
||||
<slider name="EmeraldBoobVelMax" label="Vel.Máx. Senos:" />
|
||||
<slider name="EmeraldBoobFriction" label="Fricción de Senos:"/>
|
||||
<slider name="EmeraldBoobVelMin" label="Vel.Mín.Senos:"/>
|
||||
<panel label="Física de Avatar" name="Body Dynamics">
|
||||
<text name="av_mod_textbox">
|
||||
Modificar Desplazamientos del Avatar
|
||||
</text>
|
||||
<spinner label="Modificador X" name="X Modifier" tool_tip="Utiliza esto para manipular, en grados, el delimitador del avatar. Puede ser utilizado para distorsionar las órbitas, o para elevar o aumentar los senos sin alterar el cuerpo del avatar." width="133" label_width="70"/>
|
||||
<spinner label="Modificador Y" name="Y Modifier" tool_tip="Utiliza esto para manipular, en grados, el delimitador del avatar. Puede ser utilizado para distorsionar las órbitas, o para elevar o aumentar los senos sin alterar el cuerpo del avatar." width="133" label_width="70"/>
|
||||
<spinner label="Modificador Z" name="Z Modifier" tool_tip="Utiliza esto para manipular, en grados, el delimitador del avatar. Puede ser utilizado para distorsionar las órbitas, o para elevar o aumentar los senos sin alterar el cuerpo del avatar." width="133" label_width="70"/>
|
||||
<spinner label="Modificador X" name="X Modifier" tool_tip="Utiliza esto para manipular, en grados, el delimitador del avatar. Puede ser utilizado para distorsionar las órbitas, o para subirte o bajarte sin alterar el cuerpo del avatar." width="133" label_width="70"/>
|
||||
<spinner label="Modificador Y" name="Y Modifier" tool_tip="Utiliza esto para manipular, en grados, el delimitador del avatar. Puede ser utilizado para distorsionar las órbitas, o para subirte o bajarte sin alterar el cuerpo del avatar." width="133" label_width="70"/>
|
||||
<spinner label="Modificador Z" name="Z Modifier" tool_tip="Utiliza esto para manipular, en grados, el delimitador del avatar. Puede ser utilizado para distorsionar las órbitas, o para subirte o bajarte sin alterar el cuerpo del avatar." width="133" label_width="70"/>
|
||||
</panel>
|
||||
</tab_container>
|
||||
</panel>
|
||||
|
||||
@@ -9,20 +9,16 @@
|
||||
([DEFAULT])
|
||||
</text>
|
||||
<!-- Buttons -->
|
||||
<button label="Quitar" name="btn_delete" />
|
||||
<button label="Añadir" name="btn_add"/>
|
||||
<button label="Copiar" name="btn_copy"/>
|
||||
<button label="Borrar" label_selected="Borrar" name="btn_delete" tool_tip="Borrar de la lista el Grid seleccionado"/>
|
||||
<button label="Añadir" name="btn_add" tool_tip="Agregar un nuevo Grid a la lista"/>
|
||||
<button label="Copiar" label_selected="Copiar" name="btn_copy" tool_tip="Crear una nueva entrada usando la seleccionada como plantilla"/>
|
||||
<!-- Advanced -->
|
||||
<button label="Avanzado" name="btn_advanced"/>
|
||||
<button label="Avanzado" label_selected="Avanzado" name="btn_advanced"/>
|
||||
<!-- Login URI -->
|
||||
<text name="loginuri_label">
|
||||
URL de Inicio:
|
||||
</text>
|
||||
<!--<button label="Get Grid Info" label_selected="Get Grid Info" enabled="true" name="btn_gridinfo"
|
||||
height="18" width="100" left="120" bottom_delta="-22"
|
||||
halign="center"
|
||||
follows="left|top" scale_image="true"
|
||||
font="SansSerifSmall" mouse_opaque="true" />-->
|
||||
<button label="Actualizar Información del Grid" label_selected="Actualizar Info de Grids" name="btn_gridinfo" width="170" left="120" tool_tip="Recuperar toda la información del grid desde la URI de inicio de sesión indicada (sobreescribiendo las URLs actuales, ver Avanzado)"/>-->
|
||||
<!-- Platform -->
|
||||
<text name="platform_label">
|
||||
Plataforma:
|
||||
|
||||
@@ -1,14 +1,27 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel label="Red" name="network">
|
||||
<text name="text_box">
|
||||
Ancho de banda Máximo:
|
||||
Ancho de banda UDP Máximo:
|
||||
</text>
|
||||
<slider left_delta="160" name="max_bandwidth"/>
|
||||
<text name="text_box2" left_delta="186" >
|
||||
kbps (kilobits por segundo)
|
||||
</text>
|
||||
<text name="text_box3">
|
||||
Ancho de Banda para Texturas:</text>
|
||||
<slider left_delta="160" name="tex_bandwidth"/>
|
||||
<text name="text_box2">
|
||||
kbps (kilobits por segundo)
|
||||
</text>
|
||||
<text name="cache_size_label_l">
|
||||
Tamaño de Caché de Disco (MB):
|
||||
<text bottom_delta="-25" follows="top" height="10" left="12" name="use_http_for">
|
||||
Usar HTTP para:
|
||||
</text>
|
||||
<check_box bottom_delta="-5" follows="top" left_delta="90" label="Texturas" name="http_textures"/>
|
||||
<check_box bottom_delta="0" follows="top" left_delta="90" label="Inventario" name="http_inventory"/>
|
||||
<text name="cache_size_label_l">
|
||||
Tamaño de Caché en Disco (MB):
|
||||
</text>
|
||||
<slider left_delta="160" name="cache_size"/>
|
||||
<text name="text_box5">
|
||||
MB
|
||||
</text>
|
||||
@@ -17,7 +30,7 @@
|
||||
Ubicación del Caché en Disco:
|
||||
</text>
|
||||
<button label="Establecer" label_selected="Establecer" name="set_cache"/>
|
||||
<button label="Reiniciar" label_selected="Reiniciar" name="reset_cache"/>
|
||||
<button label="Restablecer" label_selected="Restablecer" name="reset_cache"/>
|
||||
<check_box label="Puerto de Conexión Personalizado" name="connection_port_enabled"/>
|
||||
<spinner label="Puerto Número:" name="connection_port"/>
|
||||
<text name="socks5_auth_label">
|
||||
|
||||
@@ -1,19 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel label="Vent. Emergentes" name="popups" title="Ventanas Emergentes">
|
||||
<text name="dont_show_label">
|
||||
No Mostrar las siguientes Ventanas Emergentes:
|
||||
</text>
|
||||
<button label="Activar esta Ventana Emergente" name="enable_popup" width="210"/>
|
||||
<button label="Activar todas las Ventanas Emergentes..." name="reset_dialogs_btn" tool_tip="Activa todas las ventanas emergentes y las notificaciones de primera vez." left="230" width="250"/>
|
||||
<text name="show_label" >
|
||||
Mostrar las siguientes Ventanas Emergentes:
|
||||
</text>
|
||||
<button label="Desactivar Avisos de Primera Vez..." name="skip_frst_btn" tool_tip="Desactiva todos los avisos de primera vez." width="215"/>
|
||||
<button label="Desactivar todas las Ventanas Emergentes..." name="skip_dialogs_btn" tool_tip="Desactiva todas las ventanas emergentes y las notificaciones de primera vez." left="235" width="255"/>
|
||||
<text name="text_box2">
|
||||
Ofertas de Notas, texturas e Hitos:
|
||||
</text>
|
||||
<check_box label="Aceptar Automáticamente" name="accept_new_inventory"/>
|
||||
<check_box label="Ver Automáticamente despues de aceptar" name="show_new_inventory"/>
|
||||
<check_box label="Aceptar Automáticamente ofertas de Ítems" name="accept_new_inventory"/>
|
||||
<check_box label="Ver Automáticamente al aceptar" name="show_new_inventory"/>
|
||||
<check_box label="Mostrar automáticamente nuevos objetos aceptados en el inventario" name="show_in_inventory"/>
|
||||
<text name="show_label" >
|
||||
Mostrar Siempre:
|
||||
</text>
|
||||
<button label="Activar todas..." name="reset_dialogs_btn" left="15" tool_tip="Activa todas las ventanas emergentes y las notificaciones de primera vez."/>
|
||||
<button label="" name="enable_popup"/>
|
||||
<button label="Desactivar Avisos Primer Uso..." name="skip_frst_btn" tool_tip="Desactiva todos los avisos de primera vez." width="190"/>
|
||||
<button label="" left_delta="195" name="disable_popup"/>
|
||||
<button label="Desactivar todas..." name="skip_dialogs_btn" tool_tip="Desactiva todas las ventanas emergentes y las notificaciones de primera vez." left="235" width="110"/>
|
||||
<text name="dont_show_label">
|
||||
Nunca Mostrar:
|
||||
</text>
|
||||
</panel>
|
||||
|
||||
@@ -15,54 +15,57 @@
|
||||
<text name="estate_owner">
|
||||
(desconocido)
|
||||
</text>
|
||||
<check_box label="Permitir el acceso público" name="externally_visible_check"/>
|
||||
<button label="?" name="externally_visible_help"/>
|
||||
<check_box label="Permitir el chat de voz" name="voice_chat_check"/>
|
||||
<button label="?" name="voice_chat_help"/>
|
||||
<check_box label="Permitir teleporte a cualquier punto" name="allow_direct_teleport"/>
|
||||
<button label="?" name="allow_direct_teleport_help"/>
|
||||
<check_box label="Usar el horario global" name="use_global_time_check"/>
|
||||
<button label="?" name="use_global_time_help"/>
|
||||
<check_box label="Fijar el Sol" name="fixed_sun_check"/>
|
||||
<button label="?" name="fixed_sun_help"/>
|
||||
<slider label="Fase" name="sun_hour_slider"/>
|
||||
<check_box label="Permitir el acceso público" name="externally_visible_check"/>
|
||||
<button label="?" name="externally_visible_help"/>
|
||||
<button label="Aplicar" name="apply_btn"/>
|
||||
<text name="Only Allow">
|
||||
Permitir únicamente el acceso a los Residentes que:
|
||||
Permitir acceso únicamente a Residentes que:
|
||||
</text>
|
||||
<check_box label="Han aportado la información de pago." name="limit_payment" tool_tip="Para poder acceder a este estado los Residentes deben haber aportado información de pago en su cuenta. Para más información, ver support.secondlife.com."/>
|
||||
<check_box label="Son mayores de 18 años" name="limit_age_verified" tool_tip="Para poder acceder a este estado, los Residentes deben ser mayores de 18 años. Para más información, consulta support.secondlife.com."/>
|
||||
<check_box label="Permitir el chat de voz" name="voice_chat_check"/>
|
||||
<button label="?" name="voice_chat_help"/>
|
||||
<check_box label="Permitir el teleporte a cualquier punto" name="allow_direct_teleport"/>
|
||||
<button label="?" name="allow_direct_teleport_help"/>
|
||||
<text name="abuse_email_text" width="260">
|
||||
Dirección de correo-e para infracciones:
|
||||
</text>
|
||||
<string name="email_unsupported">
|
||||
Característica no disponible
|
||||
</string>
|
||||
<button label="?" name="abuse_email_address_help"/>
|
||||
<button label="Aplicar" name="apply_btn"/>
|
||||
<button label="Expulsar a un Residente del estado..." name="kick_user_from_estate_btn"/>
|
||||
<button label="Enviar un mensaje al estado..." name="message_estate_btn"/>
|
||||
<text name="estate_manager_label">
|
||||
Administradores del estado:
|
||||
</text>
|
||||
<button label="?" name="estate_manager_help"/>
|
||||
<button label="Quitar..." name="remove_estate_manager_btn"/>
|
||||
<button label="Añadir..." name="add_estate_manager_btn"/>
|
||||
<button label="?" name="estate_manager_help"/>
|
||||
<text name="allow_resident_label">
|
||||
Residentes autorizados:
|
||||
</text>
|
||||
<button label="?" name="allow_resident_help"/>
|
||||
|
||||
<!-- Estate Managers buttons -->
|
||||
<button label="Añadir..." name="add_estate_manager_btn"/>
|
||||
<button label="Quitar..." name="remove_estate_manager_btn"/>
|
||||
|
||||
<!-- Allowed Residents buttons -->
|
||||
<button label="Añadir..." name="add_allowed_avatar_btn"/>
|
||||
<button label="Quitar..." name="remove_allowed_avatar_btn"/>
|
||||
<button label="Añadir..." name="add_allowed_avatar_btn"/>
|
||||
|
||||
<text name="allow_group_label">
|
||||
Grupos autorizados:
|
||||
</text>
|
||||
<button label="?" name="allow_group_help"/>
|
||||
<button label="Quitar..." name="remove_allowed_group_btn"/>
|
||||
<button label="Añadir..." name="add_allowed_group_btn"/>
|
||||
<button label="?" name="allow_group_help"/>
|
||||
<text name="ban_resident_label">
|
||||
Residentes con el acceso prohibido:
|
||||
</text>
|
||||
<button label="?" name="ban_resident_help" right="476"/>
|
||||
|
||||
<!-- Allowed Groups buttons -->
|
||||
<button label="Añadir..." name="add_allowed_group_btn"/>
|
||||
<button label="Quitar..." name="remove_allowed_group_btn"/>
|
||||
|
||||
<!-- Banned Residents buttons -->
|
||||
<button label="Añadir..." name="add_banned_avatar_btn"/>
|
||||
<button label="Quitar..." name="remove_banned_avatar_btn"/>
|
||||
<button label="Añadir..." name="add_banned_avatar_btn"/>
|
||||
|
||||
<button label="Enviar un mensaje al estado..." name="message_estate_btn"/>
|
||||
<button label="Expulsar a un Residente del estado..." name="kick_user_from_estate_btn"/>
|
||||
</panel>
|
||||
|
||||
@@ -19,23 +19,23 @@
|
||||
desconocido
|
||||
</text>
|
||||
<check_box label="Bloquear Terraformado" name="block_terraform_check"/>
|
||||
<button label="?" name="terraform_help"/>
|
||||
<button label="?" name="terraform_help" left="225"/>
|
||||
<check_box label="Bloquear Volar" name="block_fly_check"/>
|
||||
<button label="?" name="fly_help"/>
|
||||
<button label="?" name="fly_help" left="225"/>
|
||||
<check_box label="Permitir Daño" name="allow_damage_check"/>
|
||||
<button label="?" name="damage_help"/>
|
||||
<button label="?" name="damage_help" left="225"/>
|
||||
<check_box label="Restringir Empujones" name="restrict_pushobject"/>
|
||||
<button label="?" name="restrict_pushobject_help"/>
|
||||
<button label="?" name="restrict_pushobject_help" left="225"/>
|
||||
<check_box label="Permitir reventa de terreno" name="allow_land_resell_check"/>
|
||||
<button label="?" name="land_resell_help"/>
|
||||
<button label="?" name="land_resell_help" left="225"/>
|
||||
<check_box label="Permitir Unir/Dividir Terreno" name="allow_parcel_changes_check"/>
|
||||
<button label="?" name="parcel_changes_help"/>
|
||||
<check_box label="Bloquear Mostrar Parcela en la Búsqueda" name="block_parcel_search_check" tool_tip="Permitir (o no) que la gente vea a esta región y sus parcelas en los resultados de las búsquedas"/>
|
||||
<button label="?" name="parcel_search_help"/>
|
||||
<button label="?" name="parcel_changes_help" left="225"/>
|
||||
<check_box label="Bloquear Mostrar Parcela en Búsqueda" name="block_parcel_search_check" tool_tip="Permitir (o no) que la gente vea a esta región y sus parcelas en los resultados de las búsquedas"/>
|
||||
<button label="?" name="parcel_search_help" left="225"/>
|
||||
<spinner label="Límite de Avatares" name="agent_limit_spin"/>
|
||||
<button label="?" name="agent_limit_help"/>
|
||||
<button label="?" name="agent_limit_help" left="225"/>
|
||||
<spinner label="Bonus de Objetos" name="object_bonus_spin"/>
|
||||
<button label="?" name="object_bonus_help"/>
|
||||
<button label="?" name="object_bonus_help" left="225"/>
|
||||
<text label="Calificación" name="access_text">
|
||||
Calificación:
|
||||
</text>
|
||||
@@ -50,10 +50,15 @@
|
||||
PG
|
||||
</combo_item>
|
||||
</combo_box>
|
||||
<button label="?" name="access_help"/>
|
||||
<button label="?" name="access_help" left="225"/>
|
||||
<check_box label="Usar Sol del Estado" left="250" name="use_estate_sun_check" width="200"/>
|
||||
<button label="?" name="use_estate_sun_help" left_delta="200"/>
|
||||
<check_box label="Fijar Sol" left_delta="-200" name="fixed_sun_check" width="100"/>
|
||||
<button label="?" name="fixed_sun_help" left_delta="200"/>
|
||||
<slider label="Fase" left_delta="-35" name="sun_hour_slider"/>
|
||||
<button label="Aplicar" name="apply_btn"/>
|
||||
<button label="Teleportar Usuario a su Base..." name="kick_btn"/>
|
||||
<button label="Teleportar a todos los usuarios a su base..." name="kick_all_btn"/>
|
||||
<button label="Teleportar Usuario a su Base..." name="kick_btn" width="250"/>
|
||||
<button label="Teleportar a todos los usuarios a su base..." name="kick_all_btn" width="260"/>
|
||||
<button label="Enviar mensaje a la Región..." name="im_btn"/>
|
||||
<button label="Administrar Telepuerto..." name="manage_telehub_btn"/>
|
||||
<button label="Administrar Telepuerto..." name="manage_telehub_btn" left="270"/>
|
||||
</panel>
|
||||
|
||||
@@ -6,12 +6,15 @@
|
||||
<text name="BalanceText" tool_tip="Saldo de tu cuenta">
|
||||
Cargando...
|
||||
</text>
|
||||
<text name="UPCText" tool_tip="Subir Créditos">
|
||||
UPC - N/A -
|
||||
</text>
|
||||
<button name="buycurrency" tool_tip="Comprar dinero"/>
|
||||
<text type="string" name="TimeText" tool_tip="Hora actual (Del Pacífico)">
|
||||
24:00
|
||||
</text>
|
||||
<string name="StatBarDaysOfWeek">
|
||||
Domingo:Lunes:Martes:Miércoles:Viernes:Sábado
|
||||
Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado
|
||||
</string>
|
||||
<string name="StatBarMonthsOfYear">
|
||||
Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Setiembre:Octubre:Noviembre:Diciembre
|
||||
@@ -26,6 +29,9 @@
|
||||
<button name="no_scripts" tool_tip="Prohibido ejecutar Scripts" />
|
||||
<button name="restrictpush" tool_tip="Sin Empujones" />
|
||||
<button name="status_no_voice" tool_tip="Chat de Voz No Disponible"/>
|
||||
<button label="" label_selected="" name="status_SeeAV" tool_tip="La Parcela tiene Privacidad del Avatar" width="44" />
|
||||
<button label="" name="pf_dirty" tool_tip="Los Objectos que se mueven pueden no tener un comportamiento correcto en esta región hasta que se haga un rebake de la misma."/>
|
||||
<button label="" name="pf_disabled" tool_tip="El Pathfinding Ddinámico no está habilitado en esta región."/>
|
||||
<button name="buyland" tool_tip="Comprar esta parcela" />
|
||||
<line_editor label="Buscar" name="search_editor" tool_tip="Buscar en Second Life"/>
|
||||
<button name="search_btn" tool_tip="Buscar en Second Life"/>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2,7 +2,6 @@
|
||||
<panel name="Adv_Settings">
|
||||
<panel filename="panel_bg_tab.xml"/>
|
||||
<slider label="Dist. Dibujo:" name="DrawDistance" tool_tip="Cambiar la distancia máxima de dibujo"/>
|
||||
<slider label="Ancho Banda:" name="max_bandwidth" tool_tip="Definir el ancho de banda de tu conexión en kbps (kilobits por segundos)"/>
|
||||
<slider label="Partículas:" name="MaxParticleCount" tool_tip="Cantidad de Partículas a Renderizar"/>
|
||||
<slider label="Max Avs:" name="RenderAvatarMaxVisible" tool_tip="Cuantos avatares se renderizarán en forma completa. Disminuyendo este valor incrementará los FPS en lugares saturados. Requiere que Avatar Impostors esté activado. [Por Defecto 35]"/>
|
||||
<slider label="Detalle Obj.:" name="Object Detail" tool_tip="Controla el nivel de detalle de los prims (multiplicar por el área de pantalla utilizado para calcular el nivel de detalle[0.5 to 2.0 es un valor estable])"/>
|
||||
|
||||
Reference in New Issue
Block a user