Merge remote-tracking branch 'origin/master'

This commit is contained in:
Aleric Inglewood
2012-02-01 03:35:10 +01:00
78 changed files with 6130 additions and 5026 deletions

View File

@@ -168,7 +168,10 @@ ARGUMENTS=[
dict(name='version',
description="""This specifies the version of Second Life that is
being packaged up.""",
default=get_default_version)
default=get_default_version),
dict(name='extra_libraries',
description="""List of extra libraries to include in package""",
default=None)
]
def usage(srctree=""):

View File

@@ -43,6 +43,7 @@
#include <iomanip>
#include <sstream>
#include "llfasttimer.h"
#include "lltimer.h"
#include "llstring.h"
@@ -94,9 +95,11 @@ std::string LLDate::asRFC1123() const
return toHTTPDateString (std::string ("%A, %d %b %Y %H:%M:%S GMT"));
}
LLFastTimer::DeclareTimer FT_DATE_FORMAT("Date Format");
std::string LLDate::toHTTPDateString (std::string fmt) const
{
LLFastTimer ft1(FT_DATE_FORMAT);
time_t locSeconds = (time_t) mSecondsSinceEpoch;
struct tm * gmt = gmtime (&locSeconds);
@@ -105,7 +108,7 @@ std::string LLDate::toHTTPDateString (std::string fmt) const
std::string LLDate::toHTTPDateString (tm * gmt, std::string fmt)
{
// Return Epoch UTC date
LLFastTimer ft1(FT_DATE_FORMAT);
// avoid calling setlocale() unnecessarily - it's expensive.
static std::string prev_locale = "";

View File

@@ -315,11 +315,11 @@ std::string LLFastTimer::NamedTimer::getToolTip(S32 history_idx)
if (history_idx < 0)
{
// by default, show average number of call
return llformat("%s (%d ms, %d calls)", getName().c_str(), (S32)(getCountAverage() * ms_multiplier), (S32)getCallAverage());
return llformat("%s (%.2f ms, %d calls)", getName().c_str(), (F32)((F32)getCountAverage() * ms_multiplier), (S32)getCallAverage());
}
else
{
return llformat("%s (%d ms, %d calls)", getName().c_str(), (S32)(getHistoricalCount(history_idx) * ms_multiplier), (S32)getHistoricalCalls(history_idx));
return llformat("%s (%.2f ms, %d calls)", getName().c_str(), (F32)((F32)getHistoricalCount(history_idx) * ms_multiplier), (S32)getHistoricalCalls(history_idx));
}
}
@@ -506,6 +506,15 @@ void LLFastTimer::NamedTimer::accumulateTimings()
}
}
U32 LLFastTimer::NamedTimer::getCountAverage() const
{
return mCountAverage;// (sCurFrameIndex <= 0 || mCountAverage <= 0) ? 0 : mCountAverage / llmin(sCurFrameIndex,(S32)HISTORY_NUM);
}
U32 LLFastTimer::NamedTimer::getCallAverage() const
{
return mCallAverage;// (sCurFrameIndex <= 0 || mCallAverage <= 0) ? 0 : mCallAverage / llmin(sCurFrameIndex,(S32)HISTORY_NUM);
}
// static
void LLFastTimer::NamedTimer::resetFrame()
{

View File

@@ -82,8 +82,8 @@ public:
void setCollapsed(bool collapsed) { mCollapsed = collapsed; }
bool getCollapsed() const { return mCollapsed; }
U32 getCountAverage() const { return mCountAverage; }
U32 getCallAverage() const { return mCallAverage; }
U32 getCountAverage() const; //{ return mCountAverage }
U32 getCallAverage() const; //{ return mCallAverage }
U32 getHistoricalCount(S32 history_index = 0) const;
U32 getHistoricalCalls(S32 history_index = 0) const;

View File

@@ -34,6 +34,7 @@
#include "llinventory.h"
#include "lldbstrings.h"
#include "llfasttimer.h"
#include "llinventorydefines.h"
#include "llxorcipher.h"
#include "llsd.h"
@@ -1055,8 +1056,11 @@ void LLInventoryItem::asLLSD( LLSD& sd ) const
sd[INV_CREATION_DATE_LABEL] = (S32) mCreationDate;
}
LLFastTimer::DeclareTimer FTM_INVENTORY_SD_DESERIALIZE("Inventory SD Deserialize");
bool LLInventoryItem::fromLLSD(const LLSD& sd)
{
LLFastTimer _(FTM_INVENTORY_SD_DESERIALIZE);
mInventoryType = LLInventoryType::IT_NONE;
mAssetUUID.setNull();
std::string w;

View File

@@ -2079,6 +2079,7 @@ LLVolume::LLVolume(const LLVolumeParams &params, const F32 detail, const BOOL ge
mFaceMask = 0x0;
mDetail = detail;
mSculptLevel = -2;
mSurfaceArea = 1.f; //only calculated for sculpts, defaults to 1 for all other prims
mIsMeshAssetLoaded = FALSE;
mLODScaleBias.setVec(1,1,1);
mHullPoints = NULL;
@@ -3152,6 +3153,8 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components,
{
F32 area = sculptGetSurfaceArea();
mSurfaceArea = area;
const F32 SCULPT_MAX_AREA = 384.f;
if (area < SCULPT_MIN_AREA || area > SCULPT_MAX_AREA)
@@ -4623,18 +4626,83 @@ S32 LLVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& en
genBinormals(i);
}
if (!face.mOctree)
{
face.createOctree();
}
//LLVector4a* p = (LLVector4a*) face.mPositions;
if (isUnique())
{ //don't bother with an octree for flexi volumes
U32 tri_count = face.mNumIndices/3;
LLOctreeTriangleRayIntersect intersect(start, dir, &face, &closest_t, intersection, tex_coord, normal, bi_normal);
intersect.traverse(face.mOctree);
if (intersect.mHitFace)
for (U32 j = 0; j < tri_count; ++j)
{
U16 idx0 = face.mIndices[j*3+0];
U16 idx1 = face.mIndices[j*3+1];
U16 idx2 = face.mIndices[j*3+2];
const LLVector4a& v0 = face.mPositions[idx0];
const LLVector4a& v1 = face.mPositions[idx1];
const LLVector4a& v2 = face.mPositions[idx2];
F32 a,b,t;
if (LLTriangleRayIntersect(v0, v1, v2,
start, dir, a, b, t))
{
if ((t >= 0.f) && // if hit is after start
(t <= 1.f) && // and before end
(t < closest_t)) // and this hit is closer
{
closest_t = t;
hit_face = i;
if (intersection != NULL)
{
LLVector4a intersect = dir;
intersect.mul(closest_t);
intersect.add(start);
intersection->set(intersect.getF32ptr());
}
if (tex_coord != NULL)
{
LLVector2* tc = (LLVector2*) face.mTexCoords;
*tex_coord = ((1.f - a - b) * tc[idx0] +
a * tc[idx1] +
b * tc[idx2]);
}
if (normal!= NULL)
{
LLVector4* norm = (LLVector4*) face.mNormals;
*normal = ((1.f - a - b) * LLVector3(norm[idx0]) +
a * LLVector3(norm[idx1]) +
b * LLVector3(norm[idx2]));
}
if (bi_normal != NULL)
{
LLVector4* binormal = (LLVector4*) face.mBinormals;
*bi_normal = ((1.f - a - b) * LLVector3(binormal[idx0]) +
a * LLVector3(binormal[idx1]) +
b * LLVector3(binormal[idx2]));
}
}
}
}
}
else
{
hit_face = i;
if (!face.mOctree)
{
face.createOctree();
}
LLOctreeTriangleRayIntersect intersect(start, dir, &face, &closest_t, intersection, tex_coord, normal, bi_normal);
intersect.traverse(face.mOctree);
if (intersect.mHitFace)
{
hit_face = i;
}
}
}
}

View File

@@ -971,6 +971,7 @@ public:
S32 getNumFaces() const;
S32 getNumVolumeFaces() const { return mVolumeFaces.size(); }
F32 getDetail() const { return mDetail; }
F32 getSurfaceArea() const { return mSurfaceArea; }
const LLVolumeParams& getParams() const { return mParams; }
LLVolumeParams getCopyOfParams() const { return mParams; }
const LLProfile& getProfile() const { return *mProfilep; }
@@ -1073,6 +1074,7 @@ public:
BOOL mUnique;
F32 mDetail;
S32 mSculptLevel;
F32 mSurfaceArea; //unscaled surface area
BOOL mIsMeshAssetLoaded;
LLVolumeParams mParams;

View File

@@ -73,10 +73,23 @@ BOOL shouldChange(const LLVector4& v1, const LLVector4& v2)
}
LLShaderFeatures::LLShaderFeatures()
: calculatesLighting(false), isShiny(false), isFullbright(false), hasWaterFog(false),
hasTransport(false), hasSkinning(false), hasObjectSkinning(false), hasAtmospherics(false), isSpecular(false),
hasGamma(false), hasLighting(false), isAlphaLighting(false), calculatesAtmospherics(false), mIndexedTextureChannels(0), disableTextureIndex(false),
hasAlphaMask(false)
: atmosphericHelpers(false)
, calculatesLighting(false)
, calculatesAtmospherics(false)
, hasLighting(false)
, isAlphaLighting(false)
, isShiny(false)
, isFullbright(false)
, isSpecular(false)
, hasWaterFog(false)
, hasTransport(false)
, hasSkinning(false)
, hasObjectSkinning(false)
, hasAtmospherics(false)
, hasGamma(false)
, mIndexedTextureChannels(0)
, disableTextureIndex(false)
, hasAlphaMask(false)
{
}

View File

@@ -39,10 +39,11 @@
class LLShaderFeatures
{
public:
bool atmosphericHelpers;
bool calculatesLighting;
bool calculatesAtmospherics;
bool hasLighting; // implies no transport (it's possible to have neither though)
bool isAlphaLighting; // indicates lighting shaders need not be linked in (lighting performed directly in alpha shader to match deferred lighting functions
bool isAlphaLighting; // indicates lighting shaders need not be linked in (lighting performed directly in alpha shader to match deferred lighting functions)
bool isShiny;
bool isFullbright; // implies no lighting
bool isSpecular;

View File

@@ -96,27 +96,29 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
}
}
if (features->calculatesLighting)
if (features->calculatesLighting || features->atmosphericHelpers)
{
if (!shader->attachObject("windlight/atmosphericsHelpersV.glsl"))
{
return FALSE;
}
}
if (features->calculatesLighting)
{
if (features->isSpecular)
{
if (!shader->attachObject("lighting/lightFuncSpecularV.glsl"))
{
return FALSE;
}
if (!features->isAlphaLighting)
{
if (!shader->attachObject("lighting/sumLightsSpecularV.glsl"))
{
return FALSE;
}
}
if (!shader->attachObject("lighting/lightSpecularV.glsl"))

View File

@@ -55,10 +55,10 @@ U32 nhpo2(U32 v)
//============================================================================
//static
LLVBOPool LLVertexBuffer::sStreamVBOPool;
LLVBOPool LLVertexBuffer::sDynamicVBOPool;
LLVBOPool LLVertexBuffer::sStreamIBOPool;
LLVBOPool LLVertexBuffer::sDynamicIBOPool;
LLVBOPool LLVertexBuffer::sStreamVBOPool(GL_STREAM_DRAW_ARB, GL_ARRAY_BUFFER_ARB);
LLVBOPool LLVertexBuffer::sDynamicVBOPool(GL_DYNAMIC_DRAW_ARB, GL_ARRAY_BUFFER_ARB);
LLVBOPool LLVertexBuffer::sStreamIBOPool(GL_STREAM_DRAW_ARB, GL_ELEMENT_ARRAY_BUFFER_ARB);
LLVBOPool LLVertexBuffer::sDynamicIBOPool(GL_DYNAMIC_DRAW_ARB, GL_ELEMENT_ARRAY_BUFFER_ARB);
U32 LLVBOPool::sBytesPooled = 0;
LLPrivateMemoryPool* LLVertexBuffer::sPrivatePoolp = NULL ;
@@ -67,19 +67,19 @@ U32 LLVertexBuffer::sSetCount = 0;
S32 LLVertexBuffer::sCount = 0;
S32 LLVertexBuffer::sGLCount = 0;
S32 LLVertexBuffer::sMappedCount = 0;
BOOL LLVertexBuffer::sDisableVBOMapping = FALSE ;
BOOL LLVertexBuffer::sEnableVBOs = TRUE;
bool LLVertexBuffer::sDisableVBOMapping = false;
bool LLVertexBuffer::sEnableVBOs = true;
U32 LLVertexBuffer::sGLRenderBuffer = 0;
U32 LLVertexBuffer::sGLRenderArray = 0;
U32 LLVertexBuffer::sGLRenderIndices = 0;
U32 LLVertexBuffer::sLastMask = 0;
BOOL LLVertexBuffer::sVBOActive = FALSE;
BOOL LLVertexBuffer::sIBOActive = FALSE;
bool LLVertexBuffer::sVBOActive = false;
bool LLVertexBuffer::sIBOActive = false;
U32 LLVertexBuffer::sAllocatedBytes = 0;
BOOL LLVertexBuffer::sMapped = FALSE;
BOOL LLVertexBuffer::sUseStreamDraw = TRUE;
BOOL LLVertexBuffer::sUseVAO = FALSE;
BOOL LLVertexBuffer::sPreferStreamDraw = FALSE;
bool LLVertexBuffer::sMapped = false;
bool LLVertexBuffer::sUseStreamDraw = true;
bool LLVertexBuffer::sUseVAO = false;
bool LLVertexBuffer::sPreferStreamDraw = false;
const U32 FENCE_WAIT_TIME_NANOSECONDS = 10000; //1 ms
@@ -205,15 +205,14 @@ void LLVBOPool::release(U32 name, volatile U8* buffer, U32 size)
Record rec;
rec.mGLName = name;
rec.mClientData = buffer;
sBytesPooled += size;
if (!LLVertexBuffer::sDisableVBOMapping && mUsage == GL_DYNAMIC_DRAW_ARB)
if (buffer == NULL)
{
glDeleteBuffersARB(1, &rec.mGLName);
}
else
{
sBytesPooled += size;
mFreeList[i].push_back(rec);
}
}
@@ -284,7 +283,7 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask)
{
if (sLastMask != data_mask)
{
BOOL error = FALSE;
bool error = false;
if (LLGLSLShader::sNoFixedFunction)
{
@@ -345,7 +344,7 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask)
{
if (gDebugSession)
{
error = TRUE;
error = true;
gFailLog << "Bad client state! " << array[i] << " disabled." << std::endl;
}
else
@@ -365,7 +364,7 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask)
{ //needs to be disabled, make sure it was (DEBUG TEMPORARY)
if (gDebugSession)
{
error = TRUE;
error = true;
gFailLog << "Bad client state! " << array[i] << " enabled." << std::endl;
}
else
@@ -549,7 +548,7 @@ void LLVertexBuffer::validateRange(U32 start, U32 end, U32 count, U32 indices_of
void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indices_offset) const
{
validateRange(start, end, count, indices_offset);
mMappable = FALSE;
mMappable = false;
gGL.syncMatrices();
llassert(mNumVerts >= 0);
@@ -604,7 +603,7 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi
void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
{
llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL);
mMappable = FALSE;
mMappable = false;
gGL.syncMatrices();
llassert(mNumIndices >= 0);
@@ -650,7 +649,7 @@ void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
{
llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL);
mMappable = FALSE;
mMappable = false;
gGL.syncMatrices();
llassert(mNumVerts >= 0);
@@ -693,20 +692,10 @@ void LLVertexBuffer::initClass(bool use_vbo, bool no_vbo_mapping)
sEnableVBOs = use_vbo && gGLManager.mHasVertexBufferObject ;
sDisableVBOMapping = sEnableVBOs && no_vbo_mapping ;
if(!sPrivatePoolp)
if (!sPrivatePoolp)
{
sPrivatePoolp = LLPrivateMemoryPoolManager::getInstance()->newPool(LLPrivateMemoryPool::STATIC) ;
sPrivatePoolp = LLPrivateMemoryPoolManager::getInstance()->newPool(LLPrivateMemoryPool::STATIC);
}
sStreamVBOPool.mType = GL_ARRAY_BUFFER_ARB;
sStreamVBOPool.mUsage= GL_STREAM_DRAW_ARB;
sStreamIBOPool.mType = GL_ELEMENT_ARRAY_BUFFER_ARB;
sStreamIBOPool.mUsage= GL_STREAM_DRAW_ARB;
sDynamicVBOPool.mType = GL_ARRAY_BUFFER_ARB;
sDynamicVBOPool.mUsage= GL_DYNAMIC_DRAW_ARB;
sDynamicIBOPool.mType = GL_ELEMENT_ARRAY_BUFFER_ARB;
sDynamicIBOPool.mUsage= GL_DYNAMIC_DRAW_ARB;
}
//static
@@ -719,18 +708,18 @@ void LLVertexBuffer::unbind()
#endif
sGLRenderArray = 0;
sGLRenderIndices = 0;
sIBOActive = FALSE;
sIBOActive = false;
}
if (sVBOActive)
{
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
sVBOActive = FALSE;
sVBOActive = false;
}
if (sIBOActive)
{
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
sIBOActive = FALSE;
sIBOActive = false;
}
sGLRenderBuffer = 0;
@@ -759,64 +748,79 @@ void LLVertexBuffer::cleanupClass()
//----------------------------------------------------------------------------
S32 LLVertexBuffer::determineUsage(S32 usage)
{
S32 ret_usage = usage;
if (!sEnableVBOs)
{
ret_usage = 0;
}
if (usage == GL_STREAM_DRAW_ARB && !sUseStreamDraw)
{
ret_usage = 0;
}
if (usage == GL_DYNAMIC_DRAW_ARB && sPreferStreamDraw)
{
ret_usage = GL_STREAM_DRAW_ARB;
}
if (usage == 0 && LLRender::sGLCoreProfile)
{ //MUST use VBOs for all rendering
ret_usage = GL_STREAM_DRAW_ARB;
}
if (usage && usage != GL_STREAM_DRAW_ARB)
{ //only stream_draw and dynamic_draw are supported when using VBOs, dynamic draw is the default
if (sDisableVBOMapping)
{ //always use stream draw if VBO mapping is disabled
ret_usage = GL_STREAM_DRAW_ARB;
}
else
{
ret_usage = GL_DYNAMIC_DRAW_ARB;
}
}
return ret_usage;
}
LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) :
LLRefCount(),
mNumVerts(0),
mNumIndices(0),
mUsage(usage),
mAlignedOffset(0),
mAlignedIndexOffset(0),
mSize(0),
mIndicesSize(0),
mTypeMask(typemask),
mUsage(LLVertexBuffer::determineUsage(usage)),
mGLBuffer(0),
mGLIndices(0),
mGLArray(0),
mGLIndices(0),
mMappedData(NULL),
mMappedIndexData(NULL),
mVertexLocked(FALSE),
mIndexLocked(FALSE),
mFinal(FALSE),
mEmpty(TRUE),
mMappedIndexData(NULL),
mMappedDataUsingVBOs(false),
mMappedIndexDataUsingVBOs(false),
mVertexLocked(false),
mIndexLocked(false),
mFinal(false),
mEmpty(true),
mMappable(false),
mFence(NULL)
{
LLMemType mt(LLMemType::MTYPE_VERTEX_DATA);
mFence = NULL;
if (!sEnableVBOs)
{
mUsage = 0 ;
}
if (mUsage == GL_STREAM_DRAW_ARB && !sUseStreamDraw)
{
mUsage = 0;
}
if (mUsage == GL_DYNAMIC_DRAW_ARB && sPreferStreamDraw)
{
mUsage = GL_STREAM_DRAW_ARB;
}
if (mUsage == 0 && LLRender::sGLCoreProfile)
{ //MUST use VBOs for all rendering
mUsage = GL_STREAM_DRAW_ARB;
}
if (mUsage && mUsage != GL_STREAM_DRAW_ARB)
{ //only stream_draw and dynamic_draw are supported when using VBOs, dynamic draw is the default
if (sDisableVBOMapping)
{ //always use stream draw if VBO mapping is disabled
mUsage = GL_STREAM_DRAW_ARB;
}
else
{
mUsage = GL_DYNAMIC_DRAW_ARB;
}
}
if (mUsage == GL_DYNAMIC_DRAW_ARB && !sDisableVBOMapping)
{
mMappable = TRUE;
mMappable = true;
}
else
{
mMappable = FALSE;
mMappable = false;
}
//zero out offsets
@@ -825,12 +829,6 @@ LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) :
mOffsets[i] = 0;
}
mTypeMask = typemask;
mSize = 0;
mIndicesSize = 0;
mAlignedOffset = 0;
mAlignedIndexOffset = 0;
sCount++;
}
@@ -1011,9 +1009,11 @@ void LLVertexBuffer::createGLBuffer(U32 size)
return;
}
mEmpty = TRUE;
mEmpty = true;
if (useVBOs())
mMappedDataUsingVBOs = useVBOs();
if (mMappedDataUsingVBOs)
{
genBuffer(size);
}
@@ -1040,12 +1040,14 @@ void LLVertexBuffer::createGLIndices(U32 size)
return;
}
mEmpty = TRUE;
mEmpty = true;
//pad by 16 bytes for aligned copies
size += 16;
if (useVBOs())
mMappedIndexDataUsingVBOs = useVBOs();
if (mMappedIndexDataUsingVBOs)
{
//pad by another 16 bytes for VBO pointer adjustment
size += 16;
@@ -1065,15 +1067,15 @@ void LLVertexBuffer::destroyGLBuffer()
LLMemType mt(LLMemType::MTYPE_VERTEX_DATA);
if (mGLBuffer)
{
if (useVBOs())
if (mMappedDataUsingVBOs)
{
releaseBuffer();
}
else
{
FREE_MEM(sPrivatePoolp, (void*) mMappedData) ;
FREE_MEM(sPrivatePoolp, (void*) mMappedData);
mMappedData = NULL;
mEmpty = TRUE;
mEmpty = true;
}
}
@@ -1086,15 +1088,15 @@ void LLVertexBuffer::destroyGLIndices()
LLMemType mt(LLMemType::MTYPE_VERTEX_DATA);
if (mGLIndices)
{
if (useVBOs())
if (mMappedIndexDataUsingVBOs)
{
releaseIndices();
}
else
{
FREE_MEM(sPrivatePoolp, (void*) mMappedIndexData) ;
FREE_MEM(sPrivatePoolp, (void*) mMappedIndexData);
mMappedIndexData = NULL;
mEmpty = TRUE;
mEmpty = true;
}
}
@@ -1114,9 +1116,9 @@ void LLVertexBuffer::updateNumVerts(S32 nverts)
nverts = 65535;
}
S32 needed_size = calcOffsets(mTypeMask, mOffsets, nverts);
U32 needed_size = calcOffsets(mTypeMask, mOffsets, nverts);
if (needed_size > mSize || needed_size <= mSize/2)
if (needed_size > (U32)mSize || needed_size <= (U32)mSize/2)
{
createGLBuffer(needed_size);
}
@@ -1130,9 +1132,9 @@ void LLVertexBuffer::updateNumIndices(S32 nindices)
llassert(nindices >= 0);
S32 needed_size = sizeof(U16) * nindices;
U32 needed_size = sizeof(U16) * nindices;
if (needed_size > mIndicesSize || needed_size <= mIndicesSize/2)
if (needed_size > (U32)mIndicesSize || needed_size <= (U32)mIndicesSize/2)
{
createGLIndices(needed_size);
}
@@ -1279,16 +1281,10 @@ void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices)
}
}
BOOL LLVertexBuffer::useVBOs() const
bool LLVertexBuffer::useVBOs() const
{
//it's generally ineffective to use VBO for things that are streaming on apple
if (!mUsage)
{
return FALSE;
}
return TRUE;
return (mUsage != 0);
}
//----------------------------------------------------------------------------
@@ -1366,7 +1362,7 @@ volatile U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, boo
if (!mVertexLocked)
{
mVertexLocked = TRUE;
mVertexLocked = true;
sMappedCount++;
stop_glerror();
@@ -1445,8 +1441,8 @@ volatile U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, boo
{
log_glerror();
//check the availability of memory
LLMemory::logMemoryInfo(TRUE) ;
//check the availability of memory
LLMemory::logMemoryInfo(true) ;
if(mMappable)
{
@@ -1493,6 +1489,7 @@ volatile U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, boo
static LLFastTimer::DeclareTimer FTM_VBO_MAP_INDEX_RANGE("IBO Map Range");
static LLFastTimer::DeclareTimer FTM_VBO_MAP_INDEX("IBO Map");
volatile U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
{
LLMemType mt(LLMemType::MTYPE_VERTEX_DATA);
@@ -1544,7 +1541,7 @@ volatile U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range
{
//LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_INDICES);
mIndexLocked = TRUE;
mIndexLocked = true;
sMappedCount++;
stop_glerror();
@@ -1623,7 +1620,7 @@ volatile U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range
if (!mMappedIndexData)
{
log_glerror();
LLMemory::logMemoryInfo(TRUE) ;
LLMemory::logMemoryInfo(true) ;
if(mMappable)
{
@@ -1739,12 +1736,13 @@ void LLVertexBuffer::unmapBuffer()
mMappedData = NULL;
}
mVertexLocked = FALSE ;
mVertexLocked = false;
sMappedCount--;
}
if (mMappedIndexData && mIndexLocked)
{
LLFastTimer t(FTM_IBO_UNMAP);
bindGLIndices();
if(!mMappable)
{
@@ -1805,13 +1803,13 @@ void LLVertexBuffer::unmapBuffer()
mMappedIndexData = NULL ;
}
mIndexLocked = FALSE ;
mIndexLocked = false ;
sMappedCount--;
}
if(updated_all)
{
mEmpty = FALSE;
mEmpty = false;
}
}
@@ -1831,12 +1829,12 @@ template <class T,S32 type> struct VertexBufferStrider
if (ptr == NULL)
{
llwarns << "mapIndexBuffer failed!" << llendl;
return FALSE;
return false;
}
strider = (T*)ptr;
strider.setStride(0);
return TRUE;
return true;
}
else if (vbo.hasDataType(type))
{
@@ -1847,21 +1845,18 @@ template <class T,S32 type> struct VertexBufferStrider
if (ptr == NULL)
{
llwarns << "mapVertexBuffer failed!" << llendl;
return FALSE;
return false;
}
strider = (T*)ptr;
strider.setStride(stride);
//strider.setTypeSize(LLVertexBuffer::sTypeSize[type]);
return TRUE;
return true;
}
else
{
llerrs << "VertexBufferStrider could not find valid vertex data." << llendl;
}
return FALSE;
return false;
}
};
@@ -1960,7 +1955,7 @@ bool LLVertexBuffer::bindGLBuffer(bool force_bind)
glBindBufferARB(GL_ARRAY_BUFFER_ARB, mGLBuffer);
sGLRenderBuffer = mGLBuffer;
sBindCount++;
sVBOActive = TRUE;
sVBOActive = true;
if (mGLArray)
{
@@ -1992,7 +1987,7 @@ bool LLVertexBuffer::bindGLIndices(bool force_bind)
sGLRenderIndices = mGLIndices;
stop_glerror();
sBindCount++;
sIBOActive = TRUE;
sIBOActive = true;
ret = true;
}
@@ -2014,7 +2009,7 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
LLMemType mt(LLMemType::MTYPE_VERTEX_DATA);
//set up pointers if the data mask is different ...
BOOL setup = (sLastMask != data_mask);
bool setup = (sLastMask != data_mask);
if (gDebugGL && data_mask != 0)
{ //make sure data requirements are fulfilled
@@ -2048,21 +2043,17 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
if (mGLArray)
{
bindGLArray();
setup = FALSE; //do NOT perform pointer setup if using VAO
setup = false; //do NOT perform pointer setup if using VAO
}
else
{
if (bindGLBuffer())
{
setup = TRUE;
}
if (bindGLIndices())
{
setup = TRUE;
}
const bool bindBuffer = bindGLBuffer();
const bool bindIndices = bindGLIndices();
setup = setup || bindBuffer || bindIndices;
}
BOOL error = FALSE;
bool error = false;
if (gDebugGL && !mGLArray)
{
GLint buff;
@@ -2071,7 +2062,7 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
{
if (gDebugSession)
{
error = TRUE;
error = true;
gFailLog << "Invalid GL vertex buffer bound: " << buff << std::endl;
}
else
@@ -2087,7 +2078,7 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
{
if (gDebugSession)
{
error = TRUE;
error = true;
gFailLog << "Invalid GL index buffer bound: " << buff << std::endl;
}
else
@@ -2109,7 +2100,7 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
#endif
sGLRenderArray = 0;
sGLRenderIndices = 0;
sIBOActive = FALSE;
sIBOActive = false;
}
if (mGLBuffer)
@@ -2118,13 +2109,13 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
{
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
sBindCount++;
sVBOActive = FALSE;
setup = TRUE; // ... or a VBO is deactivated
sVBOActive = false;
setup = true; // ... or a VBO is deactivated
}
if (sGLRenderBuffer != mGLBuffer)
{
sGLRenderBuffer = mGLBuffer;
setup = TRUE; // ... or a client memory pointer changed
setup = true; // ... or a client memory pointer changed
}
}
if (mGLIndices)
@@ -2133,7 +2124,7 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
{
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
sBindCount++;
sIBOActive = FALSE;
sIBOActive = false;
}
sGLRenderIndices = mGLIndices;
@@ -2221,19 +2212,19 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask)
{
S32 loc = TYPE_WEIGHT;
void* ptr = (void*)(base + mOffsets[TYPE_WEIGHT]);
glVertexAttribPointerARB(loc, 1, GL_FLOAT, FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT], ptr);
glVertexAttribPointerARB(loc, 1, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT], ptr);
}
if (data_mask & MAP_WEIGHT4)
{
S32 loc = TYPE_WEIGHT4;
void* ptr = (void*)(base+mOffsets[TYPE_WEIGHT4]);
glVertexAttribPointerARB(loc, 4, GL_FLOAT, FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT4], ptr);
glVertexAttribPointerARB(loc, 4, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT4], ptr);
}
if (data_mask & MAP_CLOTHWEIGHT)
{
S32 loc = TYPE_CLOTHWEIGHT;
void* ptr = (void*)(base + mOffsets[TYPE_CLOTHWEIGHT]);
glVertexAttribPointerARB(loc, 4, GL_FLOAT, TRUE, LLVertexBuffer::sTypeSize[TYPE_CLOTHWEIGHT], ptr);
glVertexAttribPointerARB(loc, 4, GL_FLOAT, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_CLOTHWEIGHT], ptr);
}
if (data_mask & MAP_TEXTURE_INDEX)
{

View File

@@ -56,8 +56,13 @@ class LLVBOPool
{
public:
static U32 sBytesPooled;
LLVBOPool(U32 vboUsage, U32 vboType)
: mUsage(vboUsage)
, mType(vboType)
{}
U32 mUsage;
const U32 mUsage;
U32 mType;
//size MUST be a power of 2
@@ -104,6 +109,7 @@ public:
};
LLVertexBuffer(const LLVertexBuffer& rhs)
: mUsage(rhs.mUsage)
{
*this = rhs;
}
@@ -119,9 +125,9 @@ public:
static LLVBOPool sStreamIBOPool;
static LLVBOPool sDynamicIBOPool;
static BOOL sUseStreamDraw;
static BOOL sUseVAO;
static BOOL sPreferStreamDraw;
static bool sUseStreamDraw;
static bool sUseVAO;
static bool sPreferStreamDraw;
static void initClass(bool use_vbo, bool no_vbo_mapping);
static void cleanupClass();
@@ -202,7 +208,7 @@ protected:
void destroyGLIndices();
void updateNumVerts(S32 nverts);
void updateNumIndices(S32 nindices);
virtual BOOL useVBOs() const;
bool useVBOs() const;
void unmapBuffer();
public:
@@ -240,8 +246,8 @@ public:
bool getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index=0, S32 count = -1, bool map_range = false);
BOOL isEmpty() const { return mEmpty; }
BOOL isLocked() const { return mVertexLocked || mIndexLocked; }
bool isEmpty() const { return mEmpty; }
bool isLocked() const { return mVertexLocked || mIndexLocked; }
S32 getNumVerts() const { return mNumVerts; }
S32 getNumIndices() const { return mNumIndices; }
@@ -255,7 +261,7 @@ public:
volatile U8* getMappedIndices() const { return mMappedIndexData; }
S32 getOffset(S32 type) const { return mOffsets[type]; }
S32 getUsage() const { return mUsage; }
BOOL isWriteable() const { return (mMappable || mUsage == GL_STREAM_DRAW_ARB) ? TRUE : FALSE; }
bool isWriteable() const { return (mMappable || mUsage == GL_STREAM_DRAW_ARB) ? true : false; }
void draw(U32 mode, U32 count, U32 indices_offset) const;
void drawArrays(U32 mode, U32 offset, U32 count) const;
@@ -282,11 +288,15 @@ protected:
volatile U8* mMappedData; // pointer to currently mapped data (NULL if unmapped)
volatile U8* mMappedIndexData; // pointer to currently mapped indices (NULL if unmapped)
BOOL mVertexLocked; // if TRUE, vertex buffer is being or has been written to in client memory
BOOL mIndexLocked; // if TRUE, index buffer is being or has been written to in client memory
BOOL mFinal; // if TRUE, buffer can not be mapped again
BOOL mEmpty; // if TRUE, client buffer is empty (or NULL). Old values have been discarded.
mutable BOOL mMappable; // if TRUE, use memory mapping to upload data (otherwise doublebuffer and use glBufferSubData)
U32 mMappedDataUsingVBOs : 1;
U32 mMappedIndexDataUsingVBOs : 1;
U32 mVertexLocked : 1; // if true, vertex buffer is being or has been written to in client memory
U32 mIndexLocked : 1; // if true, index buffer is being or has been written to in client memory
U32 mFinal : 1; // if true, buffer can not be mapped again
U32 mEmpty : 1; // if true, client buffer is empty (or NULL). Old values have been discarded.
mutable bool mMappable; // if true, use memory mapping to upload data (otherwise doublebuffer and use glBufferSubData)
S32 mOffsets[TYPE_MAX];
std::vector<MappedRegion> mMappedVertexRegions;
@@ -297,6 +307,7 @@ protected:
void placeFence() const;
void waitFence() const;
static S32 determineUsage(S32 usage);
private:
static LLPrivateMemoryPool* sPrivatePoolp ;
@@ -305,18 +316,18 @@ public:
static S32 sCount;
static S32 sGLCount;
static S32 sMappedCount;
static BOOL sMapped;
static bool sMapped;
typedef std::list<LLVertexBuffer*> buffer_list_t;
static BOOL sDisableVBOMapping; //disable glMapBufferARB
static BOOL sEnableVBOs;
static bool sDisableVBOMapping; //disable glMapBufferARB
static bool sEnableVBOs;
static S32 sTypeSize[TYPE_MAX];
static U32 sGLMode[LLRender::NUM_MODES];
static U32 sGLRenderBuffer;
static U32 sGLRenderArray;
static U32 sGLRenderIndices;
static BOOL sVBOActive;
static BOOL sIBOActive;
static bool sVBOActive;
static bool sIBOActive;
static U32 sLastMask;
static U32 sAllocatedBytes;
static U32 sBindCount;

View File

@@ -117,7 +117,7 @@ LLDir_Linux::LLDir_Linux()
mOSUserAppDir = "";
mLindenUserDir = "";
char path [32]; /* Flawfinder: ignore */
char path [MAX_PATH]; /* Flawfinder: ignore */
// *NOTE: /proc/%d/exe doesn't work on FreeBSD. But that's ok,
// because this is the linux implementation.

View File

@@ -56,7 +56,7 @@ static bool isProcessAlive(U32 pid)
#else //Everyone Else
static U32 getPID() {
return getpid()
return getpid();
}
static bool isProcessAlive(U32 pid)

View File

@@ -165,6 +165,7 @@ set(viewer_SOURCE_FILES
lleventinfo.cpp
lleventnotifier.cpp
lleventpoll.cpp
llexternaleditor.cpp
llface.cpp
llfasttimerview.cpp
llfeaturemanager.cpp
@@ -262,6 +263,7 @@ set(viewer_SOURCE_FILES
llfloaterwindlight.cpp
llfloaterworldmap.cpp
llfolderview.cpp
llfolderviewitem.cpp
llfollowcam.cpp
llframestats.cpp
llframestatview.cpp
@@ -370,6 +372,7 @@ set(viewer_SOURCE_FILES
llparcelselection.cpp
llpatchvertexarray.cpp
llphysicsmotion.cpp
llphysicsshapebuilderutil.cpp
llpolymesh.cpp
llpolymorph.cpp
llprefschat.cpp
@@ -642,6 +645,7 @@ set(viewer_HEADER_FILES
lleventinfo.h
lleventnotifier.h
lleventpoll.h
llexternaleditor.h
llface.h
llfasttimerview.h
llfeaturemanager.h
@@ -740,6 +744,7 @@ set(viewer_HEADER_FILES
llfloaterworldmap.h
llfolderview.h
llfoldervieweventlistener.h
llfolderviewitem.h
llfollowcam.h
llframestats.h
llframestatview.h
@@ -848,6 +853,7 @@ set(viewer_HEADER_FILES
llparcelselection.h
llpatchvertexarray.h
llphysicsmotion.h
llphysicsshapebuilderutil.h
llpolymesh.h
llpolymorph.h
llprefschat.h
@@ -1387,8 +1393,20 @@ if (WINDOWS)
else()
set(release_flags "/MAP:Release/${VIEWER_BINARY_NAME}.map")
endif()
if (FMOD)
if(MANIFEST_LIBRARIES)
set(MANIFEST_LIBRARIES "${MANIFEST_LIBRARIES}|${FMOD_BINARY_DIR}/fmod.dll")
else(MANIFEST_LIBRARIES)
set(MANIFEST_LIBRARIES "--extra_libraries=${FMOD_BINARY_DIR}/fmod.dll")
endif(MANIFEST_LIBRARIES)
endif (FMOD)
if (FMODEX)
if(MANIFEST_LIBRARIES)
set(MANIFEST_LIBRARIES "${MANIFEST_LIBRARIES}|${FMODEX_BINARY_DIR}/fmodex.dll")
else(MANIFEST_LIBRARIES)
set(MANIFEST_LIBRARIES "--extra_libraries=${FMODEX_BINARY_DIR}/fmodex.dll")
endif(MANIFEST_LIBRARIES)
set(EXTRA_LINKER_FLAGS "/DELAYLOAD:fmodex.dll")
endif (FMODEX)
@@ -1457,6 +1475,7 @@ endif (FMODEX)
--build=${CMAKE_CURRENT_BINARY_DIR}
--dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
--touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat
${MANIFEST_LIBRARIES}
DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
)

View File

@@ -7399,7 +7399,7 @@
<key>Comment</key>
<string>Translate incoming chat messages</string>
<key>Persist</key>
<integer>1</integer>
<integer>0</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
@@ -8746,6 +8746,66 @@
<key>Value</key>
<real>0.0</real>
</map>
<key>ObjectCostHighThreshold</key>
<map>
<key>Comment</key>
<string>Threshold at which object cost is considered high (displayed in red).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>50.0</real>
</map>
<key>ObjectCostLowColor</key>
<map>
<key>Comment</key>
<string>Color for object with a low object cost.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Color4</string>
<key>Value</key>
<array>
<real>0.0</real>
<real>0.5</real>
<real>1.0</real>
<real>0.5</real>
</array>
</map>
<key>ObjectCostMidColor</key>
<map>
<key>Comment</key>
<string>Color for object with a medium object cost.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Color4</string>
<key>Value</key>
<array>
<real>1.0</real>
<real>0.75</real>
<real>0.0</real>
<real>0.65</real>
</array>
</map>
<key>ObjectCostHighColor</key>
<map>
<key>Comment</key>
<string>Color for object a high object cost.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Color4</string>
<key>Value</key>
<array>
<real>1.0</real>
<real>0.0</real>
<real>0.0</real>
<real>0.75</real>
</array>
</map>
<key>ParcelMediaAutoPlayEnable</key>
<map>
<key>Comment</key>
@@ -9583,6 +9643,88 @@
<key>Value</key>
<integer>1</integer>
</map>
<key>RenderAvatarComplexityLimit</key>
<map>
<key>Comment</key>
<string>Max visual complexity of avatars in a scene</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>-1</integer>
</map>
<key>RenderComplexityColorMin</key>
<map>
<key>Comment</key>
<string>Max visual complexity of avatars in a scene</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Color4</string>
<key>Value</key>
<array>
<real>0.0</real>
<real>0.0</real>
<real>1.0</real>
<real>0.5</real>
</array>
</map>
<key>RenderComplexityColorMid</key>
<map>
<key>Comment</key>
<string>Max visual complexity of avatars in a scene</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Color4</string>
<key>Value</key>
<array>
<real>0.0</real>
<real>1.0</real>
<real>0.0</real>
<real>0.5</real>
</array>
</map>
<key>RenderComplexityColorMax</key>
<map>
<key>Comment</key>
<string>Max visual complexity of avatars in a scene</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Color4</string>
<key>Value</key>
<array>
<real>1.0</real>
<real>0.0</real>
<real>0.0</real>
<real>0.5</real>
</array>
</map>
<key>RenderComplexityThreshold</key>
<map>
<key>Comment</key>
<string>Only color objects higher than render threshold</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>-1</integer>
</map>
<key>RenderComplexityStaticMax</key>
<map>
<key>Comment</key>
<string>Sets a static max value for scaling of RenderComplexity
display (-1 for dynamic scaling)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>-1</integer>
</map>
<key>RenderAvatarLODFactor</key>
<map>
<key>Comment</key>
@@ -9847,6 +9989,17 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>RenderDebugNormalScale</key>
<map>
<key>Comment</key>
<string>Scale of normals in debug display.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>0.03</real>
</map>
<key>RenderDebugPipeline</key>
<map>
<key>Comment</key>
@@ -11139,6 +11292,28 @@
<key>Value</key>
<integer>1</integer>
</map>
<key>RenderAutoMuteByteLimit</key>
<map>
<key>Comment</key>
<string>Maximum bytes of attachments before an avatar is automatically visually muted (0 for no limit).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>RenderAutoMuteSurfaceAreaLimit</key>
<map>
<key>Comment</key>
<string>Maximum surface area of attachments before an avatar is automatically visually muted (0 for no limit).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>RenderUseShaderLOD</key>
<map>
<key>Comment</key>
@@ -14261,6 +14436,17 @@
<key>Value</key>
<real>150000.0</real>
</map>
<key>ExternalEditor</key>
<map>
<key>Comment</key>
<string>Path to program used to edit LSL scripts and XUI files, e.g.: /usr/bin/gedit --new-window "%s"</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string />
</map>
<key>YawFromMousePosition</key>
<map>
<key>Comment</key>

View File

@@ -37,8 +37,6 @@ float calcDirectionalLight(vec3 n, vec3 l);
vec3 atmosAmbient(vec3 light);
vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
vec3 scaleUpLight(vec3 light);
VARYING vec3 vary_position;
VARYING vec3 vary_ambient;
@@ -57,23 +55,29 @@ uniform vec3 light_direction[8];
uniform vec3 light_attenuation[8];
uniform vec3 light_diffuse[8];
float calcDirectionalLight(vec3 n, vec3 l)
{
float a = max(dot(n,l),0.0);
return a;
}
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
{
//get light vector
vec3 lv = lp.xyz-v;
//get distance
float d = length(lv);
float d = dot(lv,lv);
float da = 0.0;
if (d > 0.0 && la > 0.0 && fa > 0.0)
{
//normalize light vector
lv *= 1.0/d;
lv = normalize(lv);
//distance attenuation
float dist2 = d*d/(la*la);
float dist2 = d/la;
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
// spotlight coefficient.
@@ -81,7 +85,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
da *= spot*spot; // GL_SPOT_EXPONENT=2
//angular attenuation
da *= calcDirectionalLight(n, lv);
da *= max(dot(n, lv), 0.0);
}
return da;

View File

@@ -64,23 +64,29 @@ uniform vec3 light_direction[8];
uniform vec3 light_attenuation[8];
uniform vec3 light_diffuse[8];
float calcDirectionalLight(vec3 n, vec3 l)
{
float a = max(dot(n,l),0.0);
return a;
}
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
{
//get light vector
vec3 lv = lp.xyz-v;
//get distance
float d = length(lv);
float d = dot(lv,lv);
float da = 0.0;
if (d > 0.0 && la > 0.0 && fa > 0.0)
{
//normalize light vector
lv *= 1.0/d;
lv = normalize(lv);
//distance attenuation
float dist2 = d*d/(la*la);
float dist2 = d/la;
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
// spotlight coefficient.
@@ -88,7 +94,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
da *= spot*spot; // GL_SPOT_EXPONENT=2
//angular attenuation
da *= calcDirectionalLight(n, lv);
da *= max(dot(n, lv), 0.0);
}
return da;

View File

@@ -59,23 +59,29 @@ uniform vec3 light_direction[8];
uniform vec3 light_attenuation[8];
uniform vec3 light_diffuse[8];
float calcDirectionalLight(vec3 n, vec3 l)
{
float a = max(dot(n,l),0.0);
return a;
}
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
{
//get light vector
vec3 lv = lp.xyz-v;
//get distance
float d = length(lv);
float d = dot(lv,lv);
float da = 0.0;
if (d > 0.0 && la > 0.0 && fa > 0.0)
{
//normalize light vector
lv *= 1.0/d;
lv = normalize(lv);
//distance attenuation
float dist2 = d*d/(la*la);
float dist2 = d/la;
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
// spotlight coefficient.
@@ -83,7 +89,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
da *= spot*spot; // GL_SPOT_EXPONENT=2
//angular attenuation
da *= calcDirectionalLight(n, lv);
da *= max(dot(n, lv), 0.0);
}
return da;

View File

@@ -57,7 +57,7 @@ float getDepth(vec2 pos_screen)
float calc_cof(float depth)
{
float sc = abs(depth-focal_distance)/-depth*blur_constant;
float sc = (depth-focal_distance)/-depth*blur_constant;
sc /= magnification;
@@ -79,9 +79,10 @@ void main()
vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy);
float sc = calc_cof(depth);
sc = min(abs(sc), max_cof);
sc = min(sc, max_cof);
sc = max(sc, -max_cof);
vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);
gl_FragColor.rgb = diff.rgb + bloom.rgb;
gl_FragColor.a = sc/max_cof;
gl_FragColor.a = sc/max_cof*0.5+0.5;
}

View File

@@ -48,7 +48,7 @@ void main()
vec4 diff = texture2DRect(lightMap, vary_fragcoord.xy);
float a = min(diff.a * max_cof*res_scale*res_scale, 1.0);
float a = min(abs(diff.a*2.0-1.0) * max_cof*res_scale*res_scale, 1.0);
if (a > 0.25 && a < 0.75)
{ //help out the transition a bit

View File

@@ -42,7 +42,7 @@ void dofSample(inout vec4 diff, inout float w, float min_sc, vec2 tc)
{
vec4 s = texture2DRect(diffuseRect, tc);
float sc = s.a*max_cof;
float sc = abs(s.a*2.0-1.0)*max_cof;
if (sc > min_sc) //sampled pixel is more "out of focus" than current sample radius
{
@@ -57,6 +57,20 @@ void dofSample(inout vec4 diff, inout float w, float min_sc, vec2 tc)
}
}
void dofSampleNear(inout vec4 diff, inout float w, float min_sc, vec2 tc)
{
vec4 s = texture2DRect(diffuseRect, tc);
float wg = 0.25;
// de-weight dull areas to make highlights 'pop'
wg += s.r+s.g+s.b;
diff += wg*s;
w += wg;
}
void main()
{
vec2 tc = vary_fragcoord.xy;
@@ -66,12 +80,30 @@ void main()
{
float w = 1.0;
float sc = diff.a*max_cof;
float sc = (diff.a*2.0-1.0)*max_cof;
float PI = 3.14159265358979323846264;
// sample quite uniformly spaced points within a circle, for a circular 'bokeh'
if (sc > 0.5)
{
while (sc > 0.5)
{
int its = int(max(1.0,(sc*3.7)));
for (int i=0; i<its; ++i)
{
float ang = sc+i*2*PI/its; // sc is added for rotary perturbance
float samp_x = sc*sin(ang);
float samp_y = sc*cos(ang);
// you could test sample coords against an interesting non-circular aperture shape here, if desired.
dofSampleNear(diff, w, sc, vary_fragcoord.xy + vec2(samp_x,samp_y));
}
sc -= 1.0;
}
}
else if (sc < -0.5)
{
sc = abs(sc);
while (sc > 0.5)
{
int its = int(max(1.0,(sc*3.7)));

View File

@@ -39,6 +39,8 @@ float calcDirectionalLight(vec3 n, vec3 l);
mat4 getObjectSkinnedTransform();
vec3 atmosAmbient(vec3 light);
vec3 atmosAffectDirectionalLight(float lightIntensity);
vec3 scaleDownLight(vec3 light);
vec3 scaleUpLight(vec3 light);
VARYING vec3 vary_ambient;
VARYING vec3 vary_directional;
@@ -59,23 +61,29 @@ uniform vec3 light_direction[8];
uniform vec3 light_attenuation[8];
uniform vec3 light_diffuse[8];
float calcDirectionalLight(vec3 n, vec3 l)
{
float a = max(dot(n,l),0.0);
return a;
}
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
{
//get light vector
//get light vector
vec3 lv = lp.xyz-v;
//get distance
float d = length(lv);
float d = dot(lv,lv);
float da = 0.0;
if (d > 0.0 && la > 0.0 && fa > 0.0)
{
//normalize light vector
lv *= 1.0/d;
lv = normalize(lv);
//distance attenuation
float dist2 = d*d/(la*la);
float dist2 = d/la;
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
// spotlight coefficient.
@@ -83,7 +91,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
da *= spot*spot; // GL_SPOT_EXPONENT=2
//angular attenuation
da *= calcDirectionalLight(n, lv);
da *= max(dot(n, lv), 0.0);
}
return da;

View File

@@ -63,23 +63,29 @@ uniform vec3 light_direction[8];
uniform vec3 light_attenuation[8];
uniform vec3 light_diffuse[8];
float calcDirectionalLight(vec3 n, vec3 l)
{
float a = max(dot(n,l),0.0);
return a;
}
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
{
//get light vector
vec3 lv = lp.xyz-v;
//get distance
float d = length(lv);
float d = dot(lv,lv);
float da = 0.0;
if (d > 0.0 && la > 0.0 && fa > 0.0)
{
//normalize light vector
lv *= 1.0/d;
lv = normalize(lv);
//distance attenuation
float dist2 = d*d/(la*la);
float dist2 = d/la;
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
// spotlight coefficient.
@@ -87,7 +93,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
da *= spot*spot; // GL_SPOT_EXPONENT=2
//angular attenuation
da *= calcDirectionalLight(n, lv);
da *= max(dot(n, lv), 0.0);
}
return da;

View File

@@ -60,23 +60,29 @@ uniform vec3 light_direction[8];
uniform vec3 light_attenuation[8];
uniform vec3 light_diffuse[8];
float calcDirectionalLight(vec3 n, vec3 l)
{
float a = max(dot(n,l),0.0);
return a;
}
float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
{
//get light vector
vec3 lv = lp.xyz-v;
//get distance
float d = length(lv);
float d = dot(lv,lv);
float da = 0.0;
if (d > 0.0 && la > 0.0 && fa > 0.0)
{
//normalize light vector
lv *= 1.0/d;
lv = normalize(lv);
//distance attenuation
float dist2 = d*d/(la*la);
float dist2 = d/la;
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
// spotlight coefficient.
@@ -84,7 +90,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
da *= spot*spot; // GL_SPOT_EXPONENT=2
//angular attenuation
da *= calcDirectionalLight(n, lv);
da *= max(dot(n, lv), 0.0);
}
return da;

View File

@@ -3561,6 +3561,8 @@ void LLAgent::teleportCancel()
void LLAgent::teleportViaLocation(const LLVector3d& pos_global)
{
if(!isAgentAvatarValid())
return;
// [RLVa:KB] - Alternate: Snowglobe-1.2.4 | Checked: 2010-03-02 (RLVa-1.1.1a) | Modified: RLVa-1.2.0a
if (rlv_handler_t::isEnabled())
{

View File

@@ -1081,6 +1081,7 @@ BOOL LLDrawable::isVisible() const
LLSpatialBridge::LLSpatialBridge(LLDrawable* root, BOOL render_by_group, U32 data_mask)
: LLSpatialPartition(data_mask, render_by_group, GL_STREAM_DRAW_ARB)
{
mBridge = this;
mDrawable = root;
root->setSpatialBridge(this);
@@ -1109,6 +1110,15 @@ LLSpatialBridge::~LLSpatialBridge()
{
group->mSpatialPartition->remove(this, group);
}
//delete octree here so listeners will still be able to access bridge specific state
destroyTree();
}
void LLSpatialBridge::destroyTree()
{
delete mOctree;
mOctree = NULL;
}
void LLSpatialBridge::updateSpatialExtents()

View File

@@ -34,6 +34,7 @@
#define LL_LLDRAWPOOLALPHA_H
#include "lldrawpool.h"
#include "llrender.h"
#include "llframetimer.h"
class LLFace;
@@ -72,6 +73,7 @@ public:
virtual void render(S32 pass = 0);
/*virtual*/ void prerender();
void renderGroupAlpha(LLSpatialGroup* group, U32 type, U32 mask, BOOL texture = TRUE);
void renderAlpha(U32 mask);
void renderAlphaHighlight(U32 mask);

View File

@@ -1037,51 +1037,48 @@ LLViewerTexture* LLBumpImageList::getBrightnessDarknessImage(LLViewerFetchedText
llassert( (bump_code == BE_BRIGHTNESS) || (bump_code == BE_DARKNESS) );
LLViewerTexture* bump = NULL;
const F32 BRIGHTNESS_DARKNESS_PIXEL_AREA_THRESHOLD = 1000;
if( src_image->getMaxVirtualSize() > BRIGHTNESS_DARKNESS_PIXEL_AREA_THRESHOLD )
bump_image_map_t* entries_list = NULL;
void (*callback_func)( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) = NULL;
switch( bump_code )
{
bump_image_map_t* entries_list = NULL;
void (*callback_func)( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) = NULL;
case BE_BRIGHTNESS:
entries_list = &mBrightnessEntries;
callback_func = LLBumpImageList::onSourceBrightnessLoaded;
break;
case BE_DARKNESS:
entries_list = &mDarknessEntries;
callback_func = LLBumpImageList::onSourceDarknessLoaded;
break;
default:
llassert(0);
return NULL;
}
switch( bump_code )
bump_image_map_t::iterator iter = entries_list->find(src_image->getID());
if (iter != entries_list->end() && iter->second.notNull())
{
bump = iter->second;
}
else
{
LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,1);
raw->clear(0x77, 0x77, 0xFF, 0xFF);
(*entries_list)[src_image->getID()] = LLViewerTextureManager::getLocalTexture( raw.get(), TRUE);
bump = (*entries_list)[src_image->getID()]; // In case callback was called immediately and replaced the image
}
if (!src_image->hasCallbacks())
{ //if image has no callbacks but resolutions don't match, trigger raw image loaded callback again
if (src_image->getWidth() != bump->getWidth() ||
src_image->getHeight() != bump->getHeight())// ||
//(LLPipeline::sRenderDeferred && bump->getComponents() != 4))
{
case BE_BRIGHTNESS:
entries_list = &mBrightnessEntries;
callback_func = LLBumpImageList::onSourceBrightnessLoaded;
break;
case BE_DARKNESS:
entries_list = &mDarknessEntries;
callback_func = LLBumpImageList::onSourceDarknessLoaded;
break;
default:
llassert(0);
return NULL;
}
bump_image_map_t::iterator iter = entries_list->find(src_image->getID());
if (iter != entries_list->end() && iter->second.notNull())
{
bump = iter->second;
}
else
{
LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,1);
raw->clear(0x77, 0x77, 0xFF, 0xFF);
(*entries_list)[src_image->getID()] = LLViewerTextureManager::getLocalTexture( raw.get(), TRUE);
bump = (*entries_list)[src_image->getID()]; // In case callback was called immediately and replaced the image
}
if (!src_image->hasCallbacks())
{ //if image has no callbacks but resolutions don't match, trigger raw image loaded callback again
if (src_image->getWidth() != bump->getWidth() ||
src_image->getHeight() != bump->getHeight())// ||
//(LLPipeline::sRenderDeferred && bump->getComponents() != 4))
{
src_image->setBoostLevel(LLViewerTexture::BOOST_BUMP) ;
src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()), NULL );
src_image->forceToSaveRawImage(0) ;
}
src_image->setBoostLevel(LLViewerTexture::BOOST_BUMP) ;
src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()), NULL );
src_image->forceToSaveRawImage(0) ;
}
}
@@ -1593,7 +1590,7 @@ void LLDrawPoolInvisible::endDeferredPass( S32 pass )
void LLDrawPoolInvisible::renderDeferred( S32 pass )
{ //render invisiprims; this doesn't work becaue it also blocks all the post-deferred stuff
#if 0
#if 0
LLFastTimer t(FTM_RENDER_INVISIBLE);
U32 invisi_mask = LLVertexBuffer::MAP_VERTEX;

View File

@@ -0,0 +1,208 @@
/**
* @file llexternaleditor.cpp
* @brief A convenient class to run external editor.
*
* $LicenseInfo:firstyear=2010&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llexternaleditor.h"
#include "lltrans.h"
#include "llui.h"
// static
const std::string LLExternalEditor::sFilenameMarker = "%s";
// static
const std::string LLExternalEditor::sSetting = "ExternalEditor";
LLExternalEditor::EErrorCode LLExternalEditor::setCommand(const std::string& env_var, const std::string& override)
{
std::string cmd = findCommand(env_var, override);
if (cmd.empty())
{
llwarns << "Editor command is empty or not set" << llendl;
return EC_NOT_SPECIFIED;
}
// Add the filename marker if missing.
if (cmd.find(sFilenameMarker) == std::string::npos)
{
cmd += " \"" + sFilenameMarker + "\"";
llinfos << "Adding the filename marker (" << sFilenameMarker << ")" << llendl;
}
string_vec_t tokens;
if (tokenize(tokens, cmd) < 2) // 2 = bin + at least one arg (%s)
{
llwarns << "Error parsing editor command" << llendl;
return EC_PARSE_ERROR;
}
// Check executable for existence.
std::string bin_path = tokens[0];
if (!LLFile::isfile(bin_path))
{
llwarns << "Editor binary [" << bin_path << "] not found" << llendl;
return EC_BINARY_NOT_FOUND;
}
// Save command.
mProcess.setExecutable(bin_path);
mArgs.clear();
for (size_t i = 1; i < tokens.size(); ++i)
{
if (i > 1) mArgs += " ";
mArgs += "\"" + tokens[i] + "\"";
}
llinfos << "Setting command [" << bin_path << " " << mArgs << "]" << llendl;
return EC_SUCCESS;
}
LLExternalEditor::EErrorCode LLExternalEditor::run(const std::string& file_path)
{
std::string args = mArgs;
if (mProcess.getExecutable().empty() || args.empty())
{
llwarns << "Editor command not set" << llendl;
return EC_NOT_SPECIFIED;
}
// Substitute the filename marker in the command with the actual passed file name.
LLStringUtil::replaceString(args, sFilenameMarker, file_path);
// Split command into separate tokens.
string_vec_t tokens;
tokenize(tokens, args);
// Set process arguments taken from the command.
mProcess.clearArguments();
for (string_vec_t::const_iterator arg_it = tokens.begin(); arg_it != tokens.end(); ++arg_it)
{
mProcess.addArgument(*arg_it);
}
// Run the editor.
llinfos << "Running editor command [" << mProcess.getExecutable() + " " + args << "]" << llendl;
int result = mProcess.launch();
if (result == 0)
{
// Prevent killing the process in destructor (will add it to the zombies list).
mProcess.orphan();
}
return result == 0 ? EC_SUCCESS : EC_FAILED_TO_RUN;
}
// static
std::string LLExternalEditor::getErrorMessage(EErrorCode code)
{
switch (code)
{
case EC_SUCCESS: return LLTrans::getString("ok");
case EC_NOT_SPECIFIED: return LLTrans::getString("ExternalEditorNotSet");
case EC_PARSE_ERROR: return LLTrans::getString("ExternalEditorCommandParseError");
case EC_BINARY_NOT_FOUND: return LLTrans::getString("ExternalEditorNotFound");
case EC_FAILED_TO_RUN: return LLTrans::getString("ExternalEditorFailedToRun");
}
return LLTrans::getString("Unknown");
}
// static
size_t LLExternalEditor::tokenize(string_vec_t& tokens, const std::string& str)
{
tokens.clear();
// Split the argument string into separate strings for each argument
typedef boost::tokenizer< boost::char_separator<char> > tokenizer;
boost::char_separator<char> sep("", "\" ", boost::drop_empty_tokens);
tokenizer tokens_list(str, sep);
tokenizer::iterator token_iter;
BOOL inside_quotes = FALSE;
BOOL last_was_space = FALSE;
for (token_iter = tokens_list.begin(); token_iter != tokens_list.end(); ++token_iter)
{
if (!strncmp("\"",(*token_iter).c_str(),2))
{
inside_quotes = !inside_quotes;
}
else if (!strncmp(" ",(*token_iter).c_str(),2))
{
if(inside_quotes)
{
tokens.back().append(std::string(" "));
last_was_space = TRUE;
}
}
else
{
std::string to_push = *token_iter;
if (last_was_space)
{
tokens.back().append(to_push);
last_was_space = FALSE;
}
else
{
tokens.push_back(to_push);
}
}
}
return tokens.size();
}
// static
std::string LLExternalEditor::findCommand(
const std::string& env_var,
const std::string& override)
{
std::string cmd;
// Get executable path.
if (!override.empty()) // try the supplied override first
{
cmd = override;
llinfos << "Using override" << llendl;
}
else if (!gSavedSettings.getString(sSetting).empty())
{
cmd = gSavedSettings.getString(sSetting);
llinfos << "Using setting" << llendl;
}
else // otherwise use the path specified by the environment variable
{
char* env_var_val = getenv(env_var.c_str());
if (env_var_val)
{
cmd = env_var_val;
llinfos << "Using env var " << env_var << llendl;
}
}
llinfos << "Found command [" << cmd << "]" << llendl;
return cmd;
}

View File

@@ -0,0 +1,105 @@
/**
* @file llexternaleditor.h
* @brief A convenient class to run external editor.
*
* $LicenseInfo:firstyear=2010&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_LLEXTERNALEDITOR_H
#define LL_LLEXTERNALEDITOR_H
#include <llprocesslauncher.h>
/**
* Usage:
* LLExternalEditor ed;
* ed.setCommand("MY_EXTERNAL_EDITOR_VAR");
* ed.run("/path/to/file1");
* ed.run("/other/path/to/file2");
*/
class LLExternalEditor
{
typedef std::vector<std::string> string_vec_t;
public:
typedef enum e_error_code {
EC_SUCCESS, /// No error.
EC_NOT_SPECIFIED, /// Editor path not specified.
EC_PARSE_ERROR, /// Editor command parsing error.
EC_BINARY_NOT_FOUND, /// Could find the editor binary (missing or not quoted).
EC_FAILED_TO_RUN, /// Could not execute the editor binary.
} EErrorCode;
/**
* Set editor command.
*
* @param env_var Environment variable of the same purpose.
* @param override Optional override.
*
* First tries the override, then a predefined setting (sSetting),
* then the environment variable.
*
* @return EC_SUCCESS if command is valid and refers to an existing executable,
* EC_NOT_SPECIFIED or EC_FAILED_TO_RUNan on error.
*
* @see sSetting
*/
EErrorCode setCommand(const std::string& env_var, const std::string& override = LLStringUtil::null);
/**
* Run the editor with the given file.
*
* @param file_path File to edit.
* @return EC_SUCCESS on success, error code on error.
*/
EErrorCode run(const std::string& file_path);
/**
* Get a meaningful error message for the given status code.
*/
static std::string getErrorMessage(EErrorCode code);
private:
static std::string findCommand(
const std::string& env_var,
const std::string& override);
static size_t tokenize(string_vec_t& tokens, const std::string& str);
/**
* Filename placeholder that gets replaced with an actual file name.
*/
static const std::string sFilenameMarker;
/**
* Setting that can specify the editor command.
*/
static const std::string sSetting;
std::string mArgs;
LLProcessLauncher mProcess;
};
#endif // LL_LLEXTERNALEDITOR_H

View File

@@ -288,6 +288,7 @@ BOOL LLFastTimerView::handleHover(S32 x, S32 y, MASK mask)
// covering region for this new timer, go ahead and unblock
// so we can create a new tooltip
//LLToolTipMgr::instance().unblockToolTips();
gViewerWindow->unblockToolTips();
mHoverTimer = (*it);
}

File diff suppressed because it is too large Load Diff

View File

@@ -41,520 +41,28 @@
#ifndef LL_LLFOLDERVIEW_H
#define LL_LLFOLDERVIEW_H
#include <vector>
#include <map>
#include <deque>
#include "llfolderviewitem.h" // because LLFolderView is-a LLFolderViewFolder
#include "lluictrl.h"
#include "v4color.h"
#include "lldarray.h"
//#include "llviewermenu.h"
#include "stdenums.h"
#include "llfontgl.h"
#include "lleditmenuhandler.h"
#include "llviewertexture.h"
#include "lldepthstack.h"
#include "lleditmenuhandler.h"
#include "llfontgl.h"
#include "lltooldraganddrop.h"
#include "llinventoryfilter.h"
#include "llviewertexture.h"
class LLMenuGL;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLFolderViewEventListener
//
// This is an abstract base class that users of the folderview classes
// would use to catch the useful events emitted from the folder
// views.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLFolderViewItem;
class LLFolderView;
class LLInventoryModel;
class LLFolderViewFunctor;
class LLScrollableContainerView;
class LLFolderViewEventListener;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLFolderViewListenerFunctor
//
// This simple abstract base class can be used to applied to all
// listeners in a hierarchy.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLFolderViewListenerFunctor
{
public:
virtual ~LLFolderViewListenerFunctor() {}
virtual void operator()(LLFolderViewEventListener* listener) = 0;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLFolderViewFunctor
//
// Simple abstract base class for applying a functor to folders and
// items in a folder view hierarchy. This is suboptimal for algorithms
// that only work folders or only work on items, but I'll worry about
// that later when it's determined to be too slow.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLFolderViewFolder;
class LLFolderViewItem;
class LLFolderViewFolder;
// These are grouping of inventory types.
// Order matters when sorting system folders to the top.
enum EInventorySortGroup
{
SG_SYSTEM_FOLDER,
SG_TRASH_FOLDER,
SG_NORMAL_FOLDER,
SG_ITEM
};
class LLInventorySort
{
public:
LLInventorySort()
: mSortOrder(0),
mByDate(false),
mSystemToTop(false),
mFoldersByName(false) { }
// Returns true if order has changed
bool updateSort(U32 order);
U32 getSort() { return mSortOrder; }
bool operator()(const LLFolderViewItem* const& a, const LLFolderViewItem* const& b);
private:
U32 mSortOrder;
bool mByDate;
bool mSystemToTop;
bool mFoldersByName;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLFolderViewItem
//
// An instance of this class represents a single item in a folder view
// such as an inventory item or a file.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLFontGL;
class LLFolderViewFolder;
class LLFolderView;
class LLFolderViewItem : public LLUICtrl
{
friend class LLFolderViewEventListener;
private:
BOOL mIsSelected;
protected:
static const LLFontGL* sFont;
static const LLFontGL* sSmallFont;
static LLColor4 sFgColor;
static LLColor4 sHighlightBgColor;
static LLColor4 sHighlightFgColor;
static LLColor4 sFilterBGColor;
static LLColor4 sFilterTextColor;
static LLColor4 sSuffixColor;
static LLColor4 sSearchStatusColor;
static LLUIImagePtr sArrowImage;
static LLUIImagePtr sBoxImage;
std::string mLabel;
std::string mSearchableLabel;
std::string mSearchableLabelDesc;
std::string mSearchableLabelCreator;
std::string mSearchable;
std::string mType;
S32 mLabelWidth;
U32 mCreationDate;
LLFolderViewFolder* mParentFolder;
LLFolderViewEventListener* mListener;
BOOL mIsCurSelection;
BOOL mSelectPending;
LLFontGL::StyleFlags mLabelStyle;
std::string mLabelSuffix;
LLUIImagePtr mIcon;
std::string mStatusText;
BOOL mHasVisibleChildren;
S32 mIndentation;
BOOL mFiltered;
S32 mLastFilterGeneration;
std::string::size_type mStringMatchOffset;
F32 mControlLabelRotation;
LLFolderView* mRoot;
BOOL mDragAndDropTarget;
BOOL mIsLoading;
LLTimer mTimeSinceRequestStart;
// helper function to change the selection from the root.
void changeSelectionFromRoot(LLFolderViewItem* selection, BOOL selected);
// helper function to change the selection from the root.
void extendSelectionFromRoot(LLFolderViewItem* selection);
// this is an internal method used for adding items to folders. A
// no-op at this leve, but reimplemented in derived classes.
virtual BOOL addItem(LLFolderViewItem*) { return FALSE; }
virtual BOOL addFolder(LLFolderViewFolder*) { return FALSE; }
public:
// This function clears the currently selected item, and records
// the specified selected item appropriately for display and use
// in the UI. If open is TRUE, then folders are opened up along
// the way to the selection.
void setSelectionFromRoot(LLFolderViewItem* selection, BOOL openitem,
BOOL take_keyboard_focus = TRUE);
static void initClass();
static void cleanupClass();
// This function is called when the folder view is dirty. It's
// implemented here but called by derived classes when folding the
// views.
void arrangeFromRoot();
void filterFromRoot( void );
// creation_date is in UTC seconds
LLFolderViewItem( const std::string& name, LLUIImagePtr icon, S32 creation_date, LLFolderView* root, LLFolderViewEventListener* listener );
virtual ~LLFolderViewItem( void );
// addToFolder() returns TRUE if it succeeds. FALSE otherwise
enum { ARRANGE = TRUE, DO_NOT_ARRANGE = FALSE };
virtual BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root);
virtual EInventorySortGroup getSortGroup() const;
// Finds width and height of this object and it's children. Also
// makes sure that this view and it's children are the right size.
virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
virtual S32 getItemHeight();
// applies filters to control visibility of inventory items
virtual void filter( LLInventoryFilter& filter);
// updates filter serial number and optionally propagated value up to root
S32 getLastFilterGeneration() { return mLastFilterGeneration; }
virtual void dirtyFilter();
// If 'selection' is 'this' then note that otherwise ignore.
// Returns TRUE if this item ends up being selected.
virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus);
// This method is used to set the selection state of an item.
// If 'selection' is 'this' then note selection.
// Returns TRUE if the selection state of this item was changed.
virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);
// this method is used to group select items
virtual void extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items) { }
// this method is used to deselect this element
void deselectItem();
// this method is used to select this element
void selectItem();
// gets multiple-element selection
virtual BOOL getSelectionList(std::set<LLUUID> &selection){return TRUE;}
// Returns true is this object and all of its children can be removed (deleted by user)
virtual BOOL isRemovable();
// Returns true is this object and all of its children can be moved
virtual BOOL isMovable();
// destroys this item recursively
virtual void destroyView();
BOOL isSelected() const { return mIsSelected; }
void setIsCurSelection(BOOL select) { mIsCurSelection = select; }
BOOL getIsCurSelection() { return mIsCurSelection; }
BOOL hasVisibleChildren() { return mHasVisibleChildren; }
// Call through to the viewed object and return true if it can be
// removed. Returns true if it's removed.
//virtual BOOL removeRecursively(BOOL single_item);
BOOL remove();
// Build an appropriate context menu for the item. Flags unused.
void buildContextMenu(LLMenuGL& menu, U32 flags);
// This method returns the actual name of the thing being
// viewed. This method will ask the viewed object itself.
const std::string& getName( void ) const;
std::string& getSearchableLabel( void );
// This method returns the label displayed on the view. This
// method was primarily added to allow sorting on the folder
// contents possible before the entire view has been constructed.
const std::string& getLabel() const { return mLabel; }
// Used for sorting, like getLabel() above.
virtual time_t getCreationDate() const { return mCreationDate; }
LLFolderViewFolder* getParentFolder( void ) { return mParentFolder; }
const LLFolderViewFolder* getParentFolder( void ) const { return mParentFolder; }
LLFolderViewItem* getNextOpenNode( BOOL include_children = TRUE );
LLFolderViewItem* getPreviousOpenNode( BOOL include_children = TRUE );
const LLFolderViewEventListener* getListener( void ) const { return mListener; }
LLFolderViewEventListener* getListener( void ) { return mListener; }
// just rename the object.
void rename(const std::string& new_name);
// open
virtual void openItem( void );
virtual void preview(void);
// Show children (unfortunate that this is called "open")
virtual void setOpen(BOOL open = TRUE) {};
virtual BOOL isOpen() { return FALSE; }
LLFolderView* getRoot();
BOOL isDescendantOf( const LLFolderViewFolder* potential_ancestor );
S32 getIndentation() { return mIndentation; }
virtual BOOL potentiallyVisible(); // do we know for a fact that this item has been filtered out?
virtual BOOL getFiltered();
virtual BOOL getFiltered(S32 filter_generation);
virtual void setFiltered(BOOL filtered, S32 filter_generation);
// change the icon
void setIcon(LLUIImagePtr icon);
// refresh information from the object being viewed.
void refreshFromListener();
virtual void refresh();
virtual void applyListenerFunctorRecursively(LLFolderViewListenerFunctor& functor);
// LLView functionality
virtual BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask );
virtual BOOL handleHover( S32 x, S32 y, MASK mask );
virtual BOOL handleMouseUp( S32 x, S32 y, MASK mask );
virtual BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
// virtual void handleDropped();
virtual void draw();
virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg);
};
// function used for sorting.
typedef bool (*sort_order_f)(LLFolderViewItem* a, LLFolderViewItem* b);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLFolderViewFolder
//
// An instance of an LLFolderViewFolder represents a collection of
// more folders and items. This is used to build the hierarchy of
// items found in the folder view. :)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLFolderViewFolder : public LLFolderViewItem
{
public:
typedef enum e_trash
{
UNKNOWN, TRASH, NOT_TRASH
} ETrash;
private:
S32 mNumDescendantsSelected;
public: // Accessed needed by LLFolderViewItem
void recursiveIncrementNumDescendantsSelected(S32 increment);
S32 numSelected(void) const { return mNumDescendantsSelected + (isSelected() ? 1 : 0); }
protected:
typedef std::list<LLFolderViewItem*> items_t;
typedef std::list<LLFolderViewFolder*> folders_t;
items_t mItems;
folders_t mFolders;
LLInventorySort mSortFunction;
BOOL mIsOpen;
BOOL mExpanderHighlighted;
F32 mCurHeight;
F32 mTargetHeight;
F32 mAutoOpenCountdown;
time_t mSubtreeCreationDate;
mutable ETrash mAmTrash;
S32 mLastArrangeGeneration;
S32 mLastCalculatedWidth;
S32 mCompletedFilterGeneration;
S32 mMostFilteredDescendantGeneration;
public:
typedef enum e_recurse_type
{
RECURSE_NO,
RECURSE_UP,
RECURSE_DOWN,
RECURSE_UP_DOWN
} ERecurseType;
LLFolderViewFolder( const std::string& name, LLUIImagePtr icon,
LLFolderView* root,
LLFolderViewEventListener* listener );
virtual ~LLFolderViewFolder( void );
virtual BOOL potentiallyVisible();
LLFolderViewItem* getNextFromChild( LLFolderViewItem*, BOOL include_children = TRUE );
LLFolderViewItem* getPreviousFromChild( LLFolderViewItem*, BOOL include_children = TRUE );
// addToFolder() returns TRUE if it succeeds. FALSE otherwise
virtual BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root);
// Finds width and height of this object and it's children. Also
// makes sure that this view and it's children are the right size.
virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
BOOL needsArrange();
// Returns the sort group (system, trash, folder) for this folder.
virtual EInventorySortGroup getSortGroup() const;
virtual void setCompletedFilterGeneration(S32 generation, BOOL recurse_up);
virtual S32 getCompletedFilterGeneration() { return mCompletedFilterGeneration; }
BOOL hasFilteredDescendants(S32 filter_generation) { return mMostFilteredDescendantGeneration >= filter_generation; }
BOOL hasFilteredDescendants();
// applies filters to control visibility of inventory items
virtual void filter( LLInventoryFilter& filter);
virtual void setFiltered(BOOL filtered, S32 filter_generation);
virtual void dirtyFilter();
// Passes selection information on to children and record
// selection information if necessary.
// Returns TRUE if this object (or a child) ends up being selected.
// If 'openitem' is TRUE then folders are opened up along the way to the selection.
virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus);
// This method is used to change the selection of an item.
// Recursively traverse all children; if 'selection' is 'this' then change
// the select status if necessary.
// Returns TRUE if the selection state of this folder, or of a child, was changed.
virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);
// this method is used to group select items
virtual void extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items);
// Deselect this folder and all folder/items it contains recursively.
void recursiveDeselect(BOOL deselect_self);
// Returns true is this object and all of its children can be removed.
virtual BOOL isRemovable();
// Returns true is this object and all of its children can be moved
virtual BOOL isMovable();
// destroys this folder, and all children
virtual void destroyView();
// If this folder can be removed, remove all children that can be
// removed, return TRUE if this is empty after the operation and
// it's viewed folder object can be removed.
//virtual BOOL removeRecursively(BOOL single_item);
//virtual BOOL remove();
// remove the specified item (and any children) if
// possible. Return TRUE if the item was deleted.
BOOL removeItem(LLFolderViewItem* item);
// simply remove the view (and any children) Don't bother telling
// the listeners.
void removeView(LLFolderViewItem* item);
// extractItem() removes the specified item from the folder, but
// doesn't delete it.
void extractItem( LLFolderViewItem* item );
// This function is called by a child that needs to be resorted.
void resort(LLFolderViewItem* item);
void setItemSortOrder(U32 ordering);
void sortBy(U32);
//BOOL (*func)(LLFolderViewItem* a, LLFolderViewItem* b));
void setAutoOpenCountdown(F32 countdown) { mAutoOpenCountdown = countdown; }
// folders can be opened. This will usually be called by internal
// methods.
virtual void toggleOpen();
// Force a folder open or closed
virtual void setOpen(BOOL openitem = TRUE);
// Called when a child is refreshed.
// don't rearrange child folder contents unless explicitly requested
virtual void requestArrange(BOOL include_descendants = FALSE);
// internal method which doesn't update the entire view. This
// method was written because the list iterators destroy the state
// of other iterations, thus, we can't arrange while iterating
// through the children (such as when setting which is selected.
virtual void setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse = RECURSE_NO);
// Get the current state of the folder.
virtual BOOL isOpen() { return mIsOpen; }
// special case if an object is dropped on the child.
BOOL handleDragAndDropFromChild(MASK mask,
BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg);
void applyFunctorRecursively(LLFolderViewFunctor& functor);
virtual void applyListenerFunctorRecursively(LLFolderViewListenerFunctor& functor);
virtual void openItem( void );
virtual BOOL addItem(LLFolderViewItem* item);
virtual BOOL addFolder( LLFolderViewFolder* folder);
// LLView functionality
virtual BOOL handleHover(S32 x, S32 y, MASK mask);
virtual BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask );
virtual BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg);
virtual void draw();
time_t getCreationDate() const;
bool isTrash() const;
S32 getNumSelectedDescendants(void) const { return mNumDescendantsSelected; }
};
class LLInventoryModel;
class LLPanel;
class LLLineEditor;
class LLMenuGL;
class LLScrollableContainerView;
class LLUICtrl;
class LLTextBox;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLFolderView
@@ -579,22 +87,25 @@ public:
virtual BOOL canFocusChildren() const;
virtual LLFolderView* getRoot() { return this; }
// FolderViews default to sort by name. This will change that,
// and resort the items if necessary.
void setSortOrder(U32 order);
void checkTreeResortForModelChanged();
void setFilterPermMask(PermissionMask filter_perm_mask) { mFilter.setFilterPermissions(filter_perm_mask); }
void setFilterPermMask(PermissionMask filter_perm_mask);
void setSelectCallback(SelectCallback callback, void* user_data) { mSelectCallback = callback, mUserData = user_data; }
void setAllowMultiSelect(BOOL allow) { mAllowMultiSelect = allow; }
LLInventoryFilter* getFilter() { return &mFilter; }
LLInventoryFilter* getFilter();
const std::string getFilterSubString(BOOL trim = FALSE);
bool getFilterWorn() const { return mFilter.getFilterWorn(); }
U32 getFilterTypes() const { return mFilter.getFilterTypes(); }
PermissionMask getFilterPermissions() const { return mFilter.getFilterPermissions(); }
LLInventoryFilter::EFolderShow getShowFolderState() { return mFilter.getShowFolderState(); }
bool getFilterWorn() const;
U32 getFilterTypes() const;
PermissionMask getFilterPermissions() const;
// *NOTE: use getFilter()->getShowFolderState();
//LLInventoryFilter::EFolderShow getShowFolderState();
U32 getSortOrder() const;
BOOL isFilterModified() { return mFilter.isNotDefault(); }
BOOL isFilterModified();
BOOL getAllowMultiSelect() { return mAllowMultiSelect; }
U32 toggleSearchType(std::string toggle);
@@ -765,7 +276,7 @@ protected:
LLFrameTimer mAutoOpenTimer;
LLFrameTimer mSearchTimer;
std::string mSearchString;
LLInventoryFilter mFilter;
LLInventoryFilter* mFilter;
BOOL mShowSelectionContext;
BOOL mShowSingleSelection;
LLFrameTimer mMultiSelectionFadeTimer;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,541 @@
/**
* @file llfolderviewitem.h
* @brief Items and folders that can appear in a hierarchical folder view
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LLFOLDERVIEWITEM_H
#define LLFOLDERVIEWITEM_H
#include "llview.h"
#include "lldarray.h" // *TODO: Eliminate, forward declare
#include "lluiimage.h"
#include "lluictrl.h"
class LLFontGL;
class LLFolderView;
class LLFolderViewEventListener;
class LLFolderViewFolder;
class LLFolderViewFunctor;
class LLFolderViewItem;
class LLFolderViewListenerFunctor;
class LLInventoryFilter;
class LLMenuGL;
class LLUIImage;
class LLViewerInventoryItem;
// These are grouping of inventory types.
// Order matters when sorting system folders to the top.
enum EInventorySortGroup
{
SG_SYSTEM_FOLDER,
SG_TRASH_FOLDER,
SG_NORMAL_FOLDER,
SG_ITEM
};
// *TODO: do we really need one sort object per folder?
// can we just have one of these per LLFolderView ?
class LLInventorySort
{
public:
LLInventorySort()
: mSortOrder(0),
mByDate(false),
mSystemToTop(false),
mFoldersByName(false) { }
// Returns true if order has changed
bool updateSort(U32 order);
U32 getSort() { return mSortOrder; }
bool isByDate() { return mByDate; }
bool operator()(const LLFolderViewItem* const& a, const LLFolderViewItem* const& b);
private:
U32 mSortOrder;
bool mByDate;
bool mSystemToTop;
bool mFoldersByName;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLFolderViewItem
//
// An instance of this class represents a single item in a folder view
// such as an inventory item or a file.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLFolderViewItem : public LLUICtrl
{
public:
static void initClass();
static void cleanupClass();
friend class LLFolderViewEventListener;
static const S32 LEFT_PAD = 5;
static const S32 LEFT_INDENTATION = 13;
static const S32 ICON_PAD = 2;
static const S32 ICON_WIDTH = 16;
static const S32 TEXT_PAD = 1;
static const S32 ARROW_SIZE = 12;
static const S32 MAX_FOLDER_ITEM_OVERLAP = 2;
// animation parameters
static const F32 FOLDER_CLOSE_TIME_CONSTANT;
static const F32 FOLDER_OPEN_TIME_CONSTANT;
private:
BOOL mIsSelected;
protected:
static const LLFontGL* sFont;
static const LLFontGL* sSmallFont;
static LLColor4 sFgColor;
static LLColor4 sHighlightBgColor;
static LLColor4 sHighlightFgColor;
static LLColor4 sFilterBGColor;
static LLColor4 sFilterTextColor;
static LLColor4 sSuffixColor;
static LLColor4 sSearchStatusColor;
static LLUIImagePtr sArrowImage;
static LLUIImagePtr sBoxImage;
std::string mLabel;
std::string mSearchableLabel;
std::string mSearchableLabelDesc;
std::string mSearchableLabelCreator;
std::string mSearchable;
std::string mType;
S32 mLabelWidth;
U32 mCreationDate;
LLFolderViewFolder* mParentFolder;
LLFolderViewEventListener* mListener;
BOOL mIsCurSelection;
BOOL mSelectPending;
LLFontGL::StyleFlags mLabelStyle;
std::string mLabelSuffix;
LLUIImagePtr mIcon;
std::string mStatusText;
BOOL mHasVisibleChildren;
S32 mIndentation;
BOOL mPassedFilter;
S32 mLastFilterGeneration;
std::string::size_type mStringMatchOffset;
F32 mControlLabelRotation;
LLFolderView* mRoot;
BOOL mDragAndDropTarget;
BOOL mIsLoading;
LLTimer mTimeSinceRequestStart;
// helper function to change the selection from the root.
void changeSelectionFromRoot(LLFolderViewItem* selection, BOOL selected);
// helper function to change the selection from the root.
void extendSelectionFromRoot(LLFolderViewItem* selection);
// this is an internal method used for adding items to folders. A
// no-op at this leve, but reimplemented in derived classes.
virtual BOOL addItem(LLFolderViewItem*) { return FALSE; }
virtual BOOL addFolder(LLFolderViewFolder*) { return FALSE; }
public:
// This function clears the currently selected item, and records
// the specified selected item appropriately for display and use
// in the UI. If open is TRUE, then folders are opened up along
// the way to the selection.
void setSelectionFromRoot(LLFolderViewItem* selection, BOOL openitem,
BOOL take_keyboard_focus = TRUE);
// This function is called when the folder view is dirty. It's
// implemented here but called by derived classes when folding the
// views.
void arrangeFromRoot();
void filterFromRoot( void );
// creation_date is in UTC seconds
LLFolderViewItem( const std::string& name, LLUIImagePtr icon, S32 creation_date, LLFolderView* root, LLFolderViewEventListener* listener );
virtual ~LLFolderViewItem( void );
// addToFolder() returns TRUE if it succeeds. FALSE otherwise
enum { ARRANGE = TRUE, DO_NOT_ARRANGE = FALSE };
virtual BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root);
virtual EInventorySortGroup getSortGroup() const;
// Finds width and height of this object and it's children. Also
// makes sure that this view and it's children are the right size.
virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
virtual S32 getItemHeight();
// applies filters to control visibility of inventory items
virtual void filter( LLInventoryFilter& filter);
// updates filter serial number and optionally propagated value up to root
S32 getLastFilterGeneration() { return mLastFilterGeneration; }
virtual void dirtyFilter();
// If 'selection' is 'this' then note that otherwise ignore.
// Returns TRUE if this item ends up being selected.
virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus);
// This method is used to set the selection state of an item.
// If 'selection' is 'this' then note selection.
// Returns TRUE if the selection state of this item was changed.
virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);
// this method is used to group select items
virtual void extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items) { }
// this method is used to deselect this element
void deselectItem();
// this method is used to select this element
virtual void selectItem();
// gets multiple-element selection
virtual BOOL getSelectionList(std::set<LLUUID> &selection){return TRUE;}
// Returns true is this object and all of its children can be removed (deleted by user)
virtual BOOL isRemovable();
// Returns true is this object and all of its children can be moved
virtual BOOL isMovable();
// destroys this item recursively
virtual void destroyView();
BOOL isSelected() const { return mIsSelected; }
void setIsCurSelection(BOOL select) { mIsCurSelection = select; }
BOOL getIsCurSelection() { return mIsCurSelection; }
BOOL hasVisibleChildren() { return mHasVisibleChildren; }
// Call through to the viewed object and return true if it can be
// removed. Returns true if it's removed.
//virtual BOOL removeRecursively(BOOL single_item);
BOOL remove();
// Build an appropriate context menu for the item. Flags unused.
void buildContextMenu(LLMenuGL& menu, U32 flags);
// This method returns the actual name of the thing being
// viewed. This method will ask the viewed object itself.
const std::string& getName( void ) const;
std::string& getSearchableLabel( void );
// This method returns the label displayed on the view. This
// method was primarily added to allow sorting on the folder
// contents possible before the entire view has been constructed.
const std::string& getLabel() const { return mLabel; }
// Used for sorting, like getLabel() above.
virtual time_t getCreationDate() const { return mCreationDate; }
LLFolderViewFolder* getParentFolder( void ) { return mParentFolder; }
const LLFolderViewFolder* getParentFolder( void ) const { return mParentFolder; }
LLFolderViewItem* getNextOpenNode( BOOL include_children = TRUE );
LLFolderViewItem* getPreviousOpenNode( BOOL include_children = TRUE );
const LLFolderViewEventListener* getListener( void ) const { return mListener; }
LLFolderViewEventListener* getListener( void ) { return mListener; }
// Gets the inventory item if it exists (null otherwise)
LLViewerInventoryItem * getInventoryItem(void);
// just rename the object.
void rename(const std::string& new_name);
// open
virtual void openItem( void );
virtual void preview(void);
// Show children (unfortunate that this is called "open")
virtual void setOpen(BOOL open = TRUE) {};
virtual BOOL isOpen() { return FALSE; }
virtual LLFolderView* getRoot();
BOOL isDescendantOf( const LLFolderViewFolder* potential_ancestor );
S32 getIndentation() { return mIndentation; }
virtual BOOL potentiallyVisible(); // do we know for a fact that this item has been filtered out?
virtual BOOL getFiltered();
virtual BOOL getFiltered(S32 filter_generation);
virtual void setFiltered(BOOL filtered, S32 filter_generation);
// change the icon
void setIcon(LLUIImagePtr icon);
// refresh information from the object being viewed.
void refreshFromListener();
virtual void refresh();
virtual void applyListenerFunctorRecursively(LLFolderViewListenerFunctor& functor);
// LLView functionality
virtual BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask );
virtual BOOL handleHover( S32 x, S32 y, MASK mask );
virtual BOOL handleMouseUp( S32 x, S32 y, MASK mask );
virtual BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
// virtual void handleDropped();
virtual void draw();
virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg);
};
// function used for sorting.
typedef bool (*sort_order_f)(LLFolderViewItem* a, LLFolderViewItem* b);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLFolderViewFolder
//
// An instance of an LLFolderViewFolder represents a collection of
// more folders and items. This is used to build the hierarchy of
// items found in the folder view. :)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLFolderViewFolder : public LLFolderViewItem
{
protected:
LLFolderViewFolder( const std::string& name, LLUIImagePtr icon,
LLFolderView* root,
LLFolderViewEventListener* listener );
friend class LLBuildNewViewsScheduler;
friend class LLPanelInventory;
friend class LLInventoryPanel;
public:
typedef enum e_trash
{
UNKNOWN, TRASH, NOT_TRASH
} ETrash;
typedef std::list<LLFolderViewItem*> items_t;
typedef std::list<LLFolderViewFolder*> folders_t;
private:
S32 mNumDescendantsSelected;
public: // Accessed needed by LLFolderViewItem
void recursiveIncrementNumDescendantsSelected(S32 increment);
S32 numSelected(void) const { return mNumDescendantsSelected + (isSelected() ? 1 : 0); }
protected:
items_t mItems;
folders_t mFolders;
LLInventorySort mSortFunction;
BOOL mIsOpen;
BOOL mExpanderHighlighted;
F32 mCurHeight;
F32 mTargetHeight;
F32 mAutoOpenCountdown;
time_t mSubtreeCreationDate;
mutable ETrash mAmTrash;
S32 mLastArrangeGeneration;
S32 mLastCalculatedWidth;
S32 mCompletedFilterGeneration;
S32 mMostFilteredDescendantGeneration;
public:
typedef enum e_recurse_type
{
RECURSE_NO,
RECURSE_UP,
RECURSE_DOWN,
RECURSE_UP_DOWN
} ERecurseType;
virtual ~LLFolderViewFolder( void );
virtual BOOL potentiallyVisible();
LLFolderViewItem* getNextFromChild( LLFolderViewItem*, BOOL include_children = TRUE );
LLFolderViewItem* getPreviousFromChild( LLFolderViewItem*, BOOL include_children = TRUE );
// addToFolder() returns TRUE if it succeeds. FALSE otherwise
virtual BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root);
// Finds width and height of this object and it's children. Also
// makes sure that this view and it's children are the right size.
virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
BOOL needsArrange();
// Returns the sort group (system, trash, folder) for this folder.
virtual EInventorySortGroup getSortGroup() const;
virtual void setCompletedFilterGeneration(S32 generation, BOOL recurse_up);
virtual S32 getCompletedFilterGeneration() { return mCompletedFilterGeneration; }
BOOL hasFilteredDescendants(S32 filter_generation) { return mMostFilteredDescendantGeneration >= filter_generation; }
BOOL hasFilteredDescendants();
// applies filters to control visibility of inventory items
virtual void filter( LLInventoryFilter& filter);
virtual void setFiltered(BOOL filtered, S32 filter_generation);
virtual void dirtyFilter();
// Passes selection information on to children and record
// selection information if necessary.
// Returns TRUE if this object (or a child) ends up being selected.
// If 'openitem' is TRUE then folders are opened up along the way to the selection.
virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus);
// This method is used to change the selection of an item.
// Recursively traverse all children; if 'selection' is 'this' then change
// the select status if necessary.
// Returns TRUE if the selection state of this folder, or of a child, was changed.
virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);
// this method is used to group select items
virtual void extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items);
// Deselect this folder and all folder/items it contains recursively.
void recursiveDeselect(BOOL deselect_self);
// Returns true is this object and all of its children can be removed.
virtual BOOL isRemovable();
// Returns true is this object and all of its children can be moved
virtual BOOL isMovable();
// destroys this folder, and all children
virtual void destroyView();
// If this folder can be removed, remove all children that can be
// removed, return TRUE if this is empty after the operation and
// it's viewed folder object can be removed.
//virtual BOOL removeRecursively(BOOL single_item);
//virtual BOOL remove();
// remove the specified item (and any children) if
// possible. Return TRUE if the item was deleted.
BOOL removeItem(LLFolderViewItem* item);
// simply remove the view (and any children) Don't bother telling
// the listeners.
void removeView(LLFolderViewItem* item);
// extractItem() removes the specified item from the folder, but
// doesn't delete it.
void extractItem( LLFolderViewItem* item );
// This function is called by a child that needs to be resorted.
void resort(LLFolderViewItem* item);
void setItemSortOrder(U32 ordering);
void sortBy(U32);
//BOOL (*func)(LLFolderViewItem* a, LLFolderViewItem* b));
void setAutoOpenCountdown(F32 countdown) { mAutoOpenCountdown = countdown; }
// folders can be opened. This will usually be called by internal
// methods.
virtual void toggleOpen();
// Force a folder open or closed
virtual void setOpen(BOOL openitem = TRUE);
// Called when a child is refreshed.
// don't rearrange child folder contents unless explicitly requested
virtual void requestArrange(BOOL include_descendants = FALSE);
// internal method which doesn't update the entire view. This
// method was written because the list iterators destroy the state
// of other iterations, thus, we can't arrange while iterating
// through the children (such as when setting which is selected.
virtual void setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse = RECURSE_NO);
// Get the current state of the folder.
virtual BOOL isOpen() { return mIsOpen; }
// special case if an object is dropped on the child.
BOOL handleDragAndDropFromChild(MASK mask,
BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg);
void applyFunctorRecursively(LLFolderViewFunctor& functor);
virtual void applyListenerFunctorRecursively(LLFolderViewListenerFunctor& functor);
virtual void openItem( void );
virtual BOOL addItem(LLFolderViewItem* item);
virtual BOOL addFolder( LLFolderViewFolder* folder);
// LLView functionality
virtual BOOL handleHover(S32 x, S32 y, MASK mask);
virtual BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask );
virtual BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg);
virtual void draw();
time_t getCreationDate() const;
bool isTrash() const;
S32 getNumSelectedDescendants(void) const { return mNumDescendantsSelected; }
folders_t::const_iterator getFoldersBegin() const { return mFolders.begin(); }
folders_t::const_iterator getFoldersEnd() const { return mFolders.end(); }
folders_t::size_type getFoldersCount() const { return mFolders.size(); }
items_t::const_iterator getItemsBegin() const { return mItems.begin(); }
items_t::const_iterator getItemsEnd() const { return mItems.end(); }
items_t::size_type getItemsCount() const { return mItems.size(); }
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLFolderViewListenerFunctor
//
// This simple abstract base class can be used to applied to all
// listeners in a hierarchy.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLFolderViewListenerFunctor
{
public:
virtual ~LLFolderViewListenerFunctor() {}
virtual void operator()(LLFolderViewEventListener* listener) = 0;
};
#endif // LLFOLDERVIEWITEM_H

View File

@@ -39,6 +39,7 @@
#include "llfloater.h"
#include "llinventory.h"
#include "llfolderview.h"
#include "llinventoryfilter.h"
#include "llinventorymodel.h"
#include "llinventoryobserver.h"
#include "llmemberlistener.h"

View File

@@ -74,9 +74,6 @@
#include <queue>
LLFastTimer::DeclareTimer FTM_MESH_UPDATE("Mesh Update");
LLFastTimer::DeclareTimer FTM_LOAD_MESH("Load Mesh");
LLMeshRepository gMeshRepo;
const U32 MAX_MESH_REQUESTS_PER_SECOND = 100;
@@ -92,6 +89,9 @@ const S32 MAX_MESH_VERSION = 999;
U32 LLMeshRepository::sBytesReceived = 0;
U32 LLMeshRepository::sHTTPRequestCount = 0;
U32 LLMeshRepository::sHTTPRetryCount = 0;
U32 LLMeshRepository::sLODProcessing = 0;
U32 LLMeshRepository::sLODPending = 0;
U32 LLMeshRepository::sCacheBytesRead = 0;
U32 LLMeshRepository::sCacheBytesWritten = 0;
U32 LLMeshRepository::sPeakKbps = 0;
@@ -209,6 +209,12 @@ public:
LLMeshHeaderResponder(const LLVolumeParams& mesh_params)
: mMeshParams(mesh_params)
{
LLMeshRepoThread::sActiveHeaderRequests++;
}
~LLMeshHeaderResponder()
{
LLMeshRepoThread::sActiveHeaderRequests--;
}
virtual void completedRaw(U32 status, const std::string& reason,
@@ -228,6 +234,12 @@ public:
LLMeshLODResponder(const LLVolumeParams& mesh_params, S32 lod, U32 offset, U32 requested_bytes)
: mMeshParams(mesh_params), mLOD(lod), mOffset(offset), mRequestedBytes(requested_bytes)
{
LLMeshRepoThread::sActiveLODRequests++;
}
~LLMeshLODResponder()
{
LLMeshRepoThread::sActiveLODRequests--;
}
virtual void completedRaw(U32 status, const std::string& reason,
@@ -506,6 +518,7 @@ void LLMeshRepoThread::run()
mMutex->lock();
LODRequest req = mLODReqQ.front();
mLODReqQ.pop();
LLMeshRepository::sLODProcessing--;
mMutex->unlock();
if (fetchMeshLOD(req.mMeshParams, req.mLOD))
{
@@ -614,6 +627,7 @@ void LLMeshRepoThread::loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
{
LLMutexLock lock(mMutex);
mLODReqQ.push(req);
LLMeshRepository::sLODProcessing++;
}
}
else
@@ -716,7 +730,6 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
std::string http_url = constructUrl(mesh_id);
if (!http_url.empty())
{
++sActiveLODRequests;
LLMeshRepository::sHTTPRequestCount++;
mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size,
new LLMeshSkinInfoResponder(mesh_id, offset, size));
@@ -789,7 +802,6 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
std::string http_url = constructUrl(mesh_id);
if (!http_url.empty())
{
++sActiveLODRequests;
LLMeshRepository::sHTTPRequestCount++;
mCurlRequest->getByteRange(http_url, headers, offset, size,
new LLMeshDecompositionResponder(mesh_id, offset, size));
@@ -862,7 +874,6 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
std::string http_url = constructUrl(mesh_id);
if (!http_url.empty())
{
++sActiveLODRequests;
LLMeshRepository::sHTTPRequestCount++;
mCurlRequest->getByteRange(http_url, headers, offset, size,
new LLMeshPhysicsShapeResponder(mesh_id, offset, size));
@@ -913,7 +924,6 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params)
std::string http_url = constructUrl(mesh_params.getSculptID());
if (!http_url.empty())
{
++sActiveHeaderRequests;
retval = true;
//grab first 4KB if we're going to bother with a fetch. Cache will prevent future fetches if a full mesh fits
//within the first 4KB
@@ -979,7 +989,6 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
std::string http_url = constructUrl(mesh_id);
if (!http_url.empty())
{
++sActiveLODRequests;
retval = true;
LLMeshRepository::sHTTPRequestCount++;
mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size,
@@ -1055,6 +1064,7 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat
{
LODRequest req(mesh_params, iter->second[i]);
mLODReqQ.push(req);
LLMeshRepository::sLODProcessing++;
}
}
mPendingLOD.erase(iter);
@@ -1259,8 +1269,7 @@ void LLMeshUploadThread::DecompRequest::completed()
void LLMeshUploadThread::preStart()
{
//build map of LLModel refs to instances for callbacks
for (instance_list::iterator iter = mInstanceList.begin();
iter != mInstanceList.end(); ++iter)
for (instance_list::iterator iter = mInstanceList.begin(); iter != mInstanceList.end(); ++iter)
{
mInstance[iter->mModel].push_back(*iter);
}
@@ -1603,9 +1612,6 @@ void LLMeshUploadThread::requestWholeModelFee()
}
#endif //MESH_IMPORT
//static LLFastTimer::DeclareTimer FTM_NOTIFY_MESH_LOADED("Notify Loaded");
//static LLFastTimer::DeclareTimer FTM_NOTIFY_MESH_UNAVAILABLE("Notify Unavailable");
void LLMeshRepoThread::notifyLoadedMeshes()
{//called via gMeshRepo.notifyLoadedMeshes(). mMutex already locked
while (!mLoadedQ.empty())
@@ -1718,8 +1724,7 @@ void LLMeshRepository::cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header)
{
if (data.mModel[i].notNull())
{
LLPointer<LLVolume> volume = new LLVolume(volume_params,
LLVolumeLODGroup::getVolumeScaleFromDetail(i));
LLPointer<LLVolume> volume = new LLVolume(volume_params, LLVolumeLODGroup::getVolumeScaleFromDetail(i));
volume->copyVolumeFaces(data.mModel[i]);
volume->setMeshAssetLoaded(TRUE);
}
@@ -1733,7 +1738,6 @@ void LLMeshLODResponder::completedRaw(U32 status, const std::string& reason,
const LLIOPipe::buffer_ptr_t& buffer)
{
LLMeshRepoThread::sActiveLODRequests--;
S32 data_size = buffer->countAfter(channels.in(), NULL);
if (status < 200 || status > 400)
@@ -1950,7 +1954,6 @@ void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer)
{
LLMeshRepoThread::sActiveHeaderRequests--;
if (status < 200 || status > 400)
{
//llwarns
@@ -2165,8 +2168,6 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
return detail;
}
LLFastTimer t(FTM_LOAD_MESH);
{
LLMutexLock lock(mMeshMutex);
//add volume to list of loading meshes
@@ -2237,11 +2238,6 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
return detail;
}
//static LLFastTimer::DeclareTimer FTM_START_MESH_THREAD("Start Thread");
static LLFastTimer::DeclareTimer FTM_LOAD_MESH_LOD("Load LOD");
static LLFastTimer::DeclareTimer FTM_MESH_LOCK1("Lock 1");
static LLFastTimer::DeclareTimer FTM_MESH_LOCK2("Lock 2");
void LLMeshRepository::notifyLoadedMeshes()
{ //called from main thread
LLMeshRepoThread::sMaxConcurrentRequests = gSavedSettings.getU32("MeshMaxConcurrentRequests");
@@ -2343,18 +2339,9 @@ void LLMeshRepository::notifyLoadedMeshes()
}
}
LLFastTimer t(FTM_MESH_UPDATE);
{
LLFastTimer t(FTM_MESH_LOCK1);
mMeshMutex->lock();
}
{
LLFastTimer t(FTM_MESH_LOCK2);
mThread->mMutex->lock();
}
mMeshMutex->lock();
mThread->mMutex->lock();
//popup queued error messages from background threads
while (!mUploadErrorQ.empty())
{
@@ -2406,10 +2393,10 @@ void LLMeshRepository::notifyLoadedMeshes()
while (!mPendingRequests.empty() && push_count > 0)
{
LLFastTimer t(FTM_LOAD_MESH_LOD);
LLMeshRepoThread::LODRequest& request = mPendingRequests.front();
mThread->loadMeshLOD(request.mMeshParams, request.mLOD);
mPendingRequests.erase(mPendingRequests.begin());
LLMeshRepository::sLODPending--;
push_count--;
}
}
@@ -3553,18 +3540,18 @@ void LLMeshRepository::buildPhysicsMesh(LLModel::Decomposition& decomp)
hull.mVertexBase = decomp.mHull[i][0].mV;
hull.mVertexStrideBytes = 12;
LLCDMeshData mesh;
#if MESH_IMPORT
LLCDMeshData mesh;
LLCDResult res = LLCD_OK;
if (LLConvexDecomposition::getInstance() != NULL)
{
res = LLConvexDecomposition::getInstance()->getMeshFromHull(&hull, &mesh);
}
if (res == LLCD_OK)
#endif //MESH_IMPORT
{
get_vertex_buffer_from_mesh(mesh, decomp.mMesh[i]);
}
#endif //MESH_IMPORT
}
if (!decomp.mBaseHull.empty() && decomp.mBaseHullMesh.empty())
@@ -3574,18 +3561,18 @@ void LLMeshRepository::buildPhysicsMesh(LLModel::Decomposition& decomp)
hull.mVertexBase = decomp.mBaseHull[0].mV;
hull.mVertexStrideBytes = 12;
LLCDMeshData mesh;
#if MESH_IMPORT
LLCDMeshData mesh;
LLCDResult res = LLCD_OK;
if (LLConvexDecomposition::getInstance() != NULL)
{
res = LLConvexDecomposition::getInstance()->getMeshFromHull(&hull, &mesh);
}
if (res == LLCD_OK)
#endif //MESH_IMPORT
{
get_vertex_buffer_from_mesh(mesh, decomp.mBaseHullMesh);
}
#endif //MESH_IMPORT
}
}

View File

@@ -464,15 +464,14 @@ private:
class LLMeshRepository
{
private:
S32 mMeshUploadTimeOut ; //maximum time in seconds to execute an uploading request.
public:
//metrics
static U32 sBytesReceived;
static U32 sHTTPRequestCount;
static U32 sHTTPRetryCount;
static U32 sLODPending;
static U32 sLODProcessing;
static U32 sCacheBytesRead;
static U32 sCacheBytesWritten;
static U32 sPeakKbps;

View File

@@ -66,6 +66,7 @@
#include "llinventorymodel.h"
#include "llinventoryicon.h"
#include "llinventorybridge.h"
#include "llinventoryfilter.h"
#include "llmenugl.h"
#include "llpreviewanim.h"
#include "llpreviewgesture.h"

View File

@@ -45,6 +45,8 @@
#include "llkeyboard.h"
#include "lllineeditor.h"
#include "lllivefile.h"
#include "llexternaleditor.h"
#include "llnotificationsutil.h"
#include "llresmgr.h"
#include "llscrollbar.h"
@@ -147,6 +149,50 @@ static bool have_script_upload_cap(LLUUID& object_id)
return object && (! object->getRegion()->getCapability("UpdateScriptTask").empty());
}
/// ---------------------------------------------------------------------------
/// LLLiveLSLFile
/// ---------------------------------------------------------------------------
class LLLiveLSLFile : public LLLiveFile
{
public:
typedef boost::function<bool (const std::string& filename)> change_callback_t;
LLLiveLSLFile(std::string file_path, change_callback_t change_cb);
~LLLiveLSLFile();
void ignoreNextUpdate() { mIgnoreNextUpdate = true; }
protected:
/*virtual*/ bool loadFile();
change_callback_t mOnChangeCallback;
bool mIgnoreNextUpdate;
};
LLLiveLSLFile::LLLiveLSLFile(std::string file_path, change_callback_t change_cb)
: mOnChangeCallback(change_cb)
, mIgnoreNextUpdate(false)
, LLLiveFile(file_path, 1.0)
{
llassert(mOnChangeCallback);
}
LLLiveLSLFile::~LLLiveLSLFile()
{
LLFile::remove(filename());
}
bool LLLiveLSLFile::loadFile()
{
if (mIgnoreNextUpdate)
{
mIgnoreNextUpdate = false;
return true;
}
return mOnChangeCallback(filename());
}
/// ---------------------------------------------------------------------------
/// LLScriptEdCore
/// ---------------------------------------------------------------------------
@@ -169,6 +215,8 @@ LLScriptEdCore::LLScriptEdCore(
void (*save_callback)(void*, BOOL),
void (*search_replace_callback) (void* userdata),
void* userdata,
LLUUID objectUUID,
LLUUID itemUUID,
S32 bottom_pad)
:
LLPanel( std::string("name"), rect ),
@@ -183,8 +231,11 @@ LLScriptEdCore::LLScriptEdCore(
mLastHelpToken(NULL),
mLiveHelpHistorySize(0),
mEnableSave(FALSE),
mLiveFile(NULL),
mHasScriptData(FALSE),
LLEventTimer(60)
LLEventTimer(60),
mObjectUUID(objectUUID),
mItemUUID(itemUUID)
{
setFollowsAll();
setBorderVisible(FALSE);
@@ -275,6 +326,7 @@ LLScriptEdCore::LLScriptEdCore(
childSetCommitCallback("lsl errors", &LLScriptEdCore::onErrorList, this);
childSetAction("Save_btn", onBtnSave,this);
childSetAction("Edit_btn", openInExternalEditor, this);
initMenu();
@@ -290,6 +342,7 @@ LLScriptEdCore::LLScriptEdCore(
LLScriptEdCore::~LLScriptEdCore()
{
deleteBridges();
delete mLiveFile;
}
BOOL LLScriptEdCore::tick()
@@ -359,6 +412,106 @@ void LLScriptEdCore::setScriptText(const std::string& text, BOOL is_valid)
}
}
bool LLScriptEdCore::loadScriptText(const std::string& filename)
{
if (filename.empty())
{
llwarns << "Empty file name" << llendl;
return false;
}
LLFILE* file = LLFile::fopen(filename, "rb"); /*Flawfinder: ignore*/
if (!file)
{
llwarns << "Error opening " << filename << llendl;
return false;
}
// read in the whole file
fseek(file, 0L, SEEK_END);
size_t file_length = (size_t) ftell(file);
fseek(file, 0L, SEEK_SET);
char* buffer = new char[file_length+1];
size_t nread = fread(buffer, 1, file_length, file);
if (nread < file_length)
{
llwarns << "Short read" << llendl;
}
buffer[nread] = '\0';
fclose(file);
mEditor->setText(LLStringExplicit(buffer));
delete[] buffer;
return true;
}
bool LLScriptEdCore::writeToFile(const std::string& filename)
{
LLFILE* fp = LLFile::fopen(filename, "wb");
if (!fp)
{
llwarns << "Unable to write to " << filename << llendl;
LLSD row;
row["columns"][0]["value"] = "Error writing to local file. Is your hard drive full?";
row["columns"][0]["font"] = "SANSSERIF_SMALL";
mErrorList->addElement(row);
return false;
}
std::string utf8text = mEditor->getText();
// Special case for a completely empty script - stuff in one space so it can store properly. See SL-46889
if (utf8text.size() == 0)
{
utf8text = " ";
}
fputs(utf8text.c_str(), fp);
fclose(fp);
return true;
}
void LLScriptEdCore::sync()
{
// Sync with external editor.
std::string tmp_file = getTmpFileName();
llstat s;
if (LLFile::stat(tmp_file, &s) == 0) // file exists
{
if (mLiveFile) mLiveFile->ignoreNextUpdate();
writeToFile(tmp_file);
}
}
std::string LLScriptEdCore::getTmpFileName()
{
// Take script inventory item id (within the object inventory)
// to consideration so that it's possible to edit multiple scripts
// in the same object inventory simultaneously (STORM-781).
std::string script_id = mObjectUUID.asString() + "_" + mItemUUID.asString();
// Use MD5 sum to make the file name shorter and not exceed maximum path length.
char script_id_hash_str[33]; /* Flawfinder: ignore */
LLMD5 script_id_hash((const U8 *)script_id.c_str());
script_id_hash.hex_digest(script_id_hash_str);
return std::string(LLFile::tmpdir()) + "sl_script_" + script_id_hash_str + ".lsl";
}
bool LLScriptEdCore::onExternalChange(const std::string& filename)
{
if (!loadScriptText(filename))
{
return false;
}
// Avoid recursive save/compile loop
doSave(this, false, false);
return true;
}
BOOL LLScriptEdCore::hasChanged(void* userdata)
{
LLScriptEdCore* self = (LLScriptEdCore*)userdata;
@@ -752,7 +905,7 @@ void LLScriptEdCore::onBtnInsertFunction(LLUICtrl *ui, void* userdata)
}
// static
void LLScriptEdCore::doSave( void* userdata, BOOL close_after_save )
void LLScriptEdCore::doSave( void* userdata, BOOL close_after_save, BOOL sync_external_editor)
{
LLViewerStats::getInstance()->incStat( LLViewerStats::ST_LSL_SAVE_COUNT );
@@ -762,6 +915,56 @@ void LLScriptEdCore::doSave( void* userdata, BOOL close_after_save )
{
self->mSaveCallback( self->mUserdata, close_after_save );
}
if ( sync_external_editor )
{
self->sync();
}
}
void LLScriptEdCore::openInExternalEditor(void *userdata)
{
LLScriptEdCore* self = (LLScriptEdCore*) userdata;
delete self->mLiveFile; // deletes file
// Save the script to a temporary file.
std::string filename = self->getTmpFileName();
self->writeToFile(filename);
// Start watching file changes.
self->mLiveFile = new LLLiveLSLFile(filename, boost::bind(&LLScriptEdCore::onExternalChange, self, _1));
self->mLiveFile->ignoreNextUpdate();
self->mLiveFile->addToEventTimer();
// Open it in external editor.
{
LLExternalEditor ed;
LLExternalEditor::EErrorCode status;
std::string msg;
status = ed.setCommand("LL_SCRIPT_EDITOR");
if (status != LLExternalEditor::EC_SUCCESS)
{
if (status == LLExternalEditor::EC_NOT_SPECIFIED) // Use custom message for this error.
{
msg = "External editor not set";
}
else
{
msg = LLExternalEditor::getErrorMessage(status);
}
LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", msg));
return;
}
status = ed.run(filename);
if (status != LLExternalEditor::EC_SUCCESS)
{
msg = LLExternalEditor::getErrorMessage(status);
LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", msg));
}
}
}
// static
@@ -1038,6 +1241,8 @@ void* LLPreviewLSL::createScriptEdPanel(void* userdata)
LLPreviewLSL::onSave,
LLPreviewLSL::onSearchReplace,
self,
self->mObjectID,
self->mItemUUID,
0);
return self->mScriptEd;
@@ -1602,6 +1807,8 @@ void* LLLiveLSLEditor::createScriptEdPanel(void* userdata)
&LLLiveLSLEditor::onSave,
&LLLiveLSLEditor::onSearchReplace,
self,
self->mObjectID,
self->mItemUUID,
0);
return self->mScriptEd;

View File

@@ -42,7 +42,7 @@
#include "llframetimer.h"
#include "lleventtimer.h"
class LLLiveLSLFile;
class LLMessageSystem;
class LLTextEditor;
class LLButton;
@@ -72,6 +72,8 @@ public:
void (*save_callback)(void* userdata, BOOL close_after_save),
void (*search_replace_callback)(void* userdata),
void* userdata,
LLUUID objectUUID,
LLUUID itemUUID,
S32 bottom_pad = 0); // pad below bottom row of buttons
~LLScriptEdCore();
@@ -82,6 +84,12 @@ public:
BOOL canClose();
void setScriptText(const std::string& text, BOOL is_valid);
bool loadScriptText(const std::string& filename);
bool writeToFile(const std::string& filename);
void sync();
std::string getTmpFileName();
static void openInExternalEditor(void* userdata);
bool onExternalChange(const std::string& filename);
bool handleSaveChangesDialog(const LLSD& notification, const LLSD& response);
bool handleReloadFromServerDialog(const LLSD& notification, const LLSD& response);
@@ -95,7 +103,7 @@ public:
static void onClickForward(void* userdata);
static void onBtnInsertSample(void*);
static void onBtnInsertFunction(LLUICtrl*, void*);
static void doSave( void* userdata, BOOL close_after_save );
static void doSave( void* userdata, BOOL close_after_save, BOOL sync_external_editor = TRUE );
static void onBtnSave(void*);
static void onBtnUndoChanges(void*);
static void onSearchMenu(void* userdata);
@@ -158,6 +166,9 @@ private:
S32 mLiveHelpHistorySize;
BOOL mEnableSave;
BOOL mHasScriptData;
LLLiveLSLFile* mLiveFile;
LLUUID mObjectUUID;
LLUUID mItemUUID;
};

View File

@@ -1078,6 +1078,8 @@ void LLSpatialGroup::clearOcclusionState(eOcclusionState state, S32 mode)
LLSpatialGroup::LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part) :
mState(0),
mGeometryBytes(0),
mSurfaceArea(0.f),
mBuilt(0.f),
mOctreeNode(node),
mSpatialPartition(part),
@@ -1086,9 +1088,7 @@ LLSpatialGroup::LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part) :
mDistance(0.f),
mDepth(0.f),
mLastUpdateDistance(-1.f),
mLastUpdateTime(gFrameTimeSeconds),
mViewAngle(0.f),
mLastUpdateViewAngle(-1.f)
mLastUpdateTime(gFrameTimeSeconds)
{
sNodeCount++;
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
@@ -1302,6 +1302,17 @@ void LLSpatialGroup::handleDestruction(const TreeNode* node)
}
}
//clean up avatar attachment stats
LLSpatialBridge* bridge = mSpatialPartition->asBridge();
if (bridge)
{
if (bridge->mAvatar.notNull())
{
bridge->mAvatar->mAttachmentGeometryBytes -= mGeometryBytes;
bridge->mAvatar->mAttachmentSurfaceArea -= mSurfaceArea;
}
}
clearDrawMap();
mVertexBuffer = NULL;
mBufferMap.clear();
@@ -1659,7 +1670,7 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)
//==============================================
LLSpatialPartition::LLSpatialPartition(U32 data_mask, BOOL render_by_group, U32 buffer_usage)
: mRenderByGroup(render_by_group)
: mRenderByGroup(render_by_group), mBridge(NULL)
{
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
mOcclusionEnabled = TRUE;
@@ -2718,6 +2729,115 @@ void renderUpdateType(LLDrawable* drawablep)
}
}
void renderComplexityDisplay(LLDrawable* drawablep)
{
LLViewerObject* vobj = drawablep->getVObj();
if (!vobj)
{
return;
}
LLVOVolume *voVol = dynamic_cast<LLVOVolume*>(vobj);
if (!voVol)
{
return;
}
if (!voVol->isRoot())
{
return;
}
LLVOVolume::texture_cost_t textures;
F32 cost = (F32) voVol->getRenderCost(textures);
// add any child volumes
LLViewerObject::const_child_list_t children = voVol->getChildren();
for (LLViewerObject::const_child_list_t::const_iterator iter = children.begin(); iter != children.end(); ++iter)
{
const LLViewerObject *child = *iter;
const LLVOVolume *child_volume = dynamic_cast<const LLVOVolume*>(child);
if (child_volume)
{
cost += child_volume->getRenderCost(textures);
}
}
// add texture cost
for (LLVOVolume::texture_cost_t::iterator iter = textures.begin(); iter != textures.end(); ++iter)
{
// add the cost of each individual texture in the linkset
cost += iter->second;
}
F32 cost_max = (F32) LLVOVolume::getRenderComplexityMax();
// allow user to set a static color scale
if (gSavedSettings.getS32("RenderComplexityStaticMax") > 0)
{
cost_max = gSavedSettings.getS32("RenderComplexityStaticMax");
}
F32 cost_ratio = cost / cost_max;
// cap cost ratio at 1.0f in case cost_max is at a low threshold
cost_ratio = cost_ratio > 1.0f ? 1.0f : cost_ratio;
LLGLEnable blend(GL_BLEND);
LLColor4 color;
const LLColor4 color_min = gSavedSettings.getColor4("RenderComplexityColorMin");
const LLColor4 color_mid = gSavedSettings.getColor4("RenderComplexityColorMid");
const LLColor4 color_max = gSavedSettings.getColor4("RenderComplexityColorMax");
if (cost_ratio < 0.5f)
{
color = color_min * (1 - cost_ratio * 2) + color_mid * (cost_ratio * 2);
}
else
{
color = color_mid * (1 - (cost_ratio - 0.5) * 2) + color_max * ((cost_ratio - 0.5) * 2);
}
LLSD color_val = color.getValue();
// don't highlight objects below the threshold
if (cost > gSavedSettings.getS32("RenderComplexityThreshold"))
{
glColor4f(color[0],color[1],color[2],0.5f);
S32 num_faces = drawablep->getNumFaces();
if (num_faces)
{
for (S32 i = 0; i < num_faces; ++i)
{
pushVerts(drawablep->getFace(i), LLVertexBuffer::MAP_VERTEX);
}
}
LLViewerObject::const_child_list_t children = voVol->getChildren();
for (LLViewerObject::const_child_list_t::const_iterator iter = children.begin(); iter != children.end(); ++iter)
{
const LLViewerObject *child = *iter;
if (child)
{
num_faces = child->getNumFaces();
if (num_faces)
{
for (S32 i = 0; i < num_faces; ++i)
{
pushVerts(child->mDrawable->getFace(i), LLVertexBuffer::MAP_VERTEX);
}
}
}
}
}
voVol->setDebugText(llformat("%4.0f", cost));
}
void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE)
{
@@ -2811,7 +2931,490 @@ void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE)
{
drawBoxOutline(pos,size);
}
}
void renderNormals(LLDrawable* drawablep)
{
LLVertexBuffer::unbind();
LLVOVolume* vol = drawablep->getVOVolume();
if (vol)
{
LLVolume* volume = vol->getVolume();
gGL.pushMatrix();
gGL.multMatrix((F32*) vol->getRelativeXform().mMatrix);
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
LLVector4a scale(gSavedSettings.getF32("RenderDebugNormalScale"));
for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
{
const LLVolumeFace& face = volume->getVolumeFace(i);
for (S32 j = 0; j < face.mNumVertices; ++j)
{
gGL.begin(LLRender::LINES);
LLVector4a n,p;
n.setMul(face.mNormals[j], scale);
p.setAdd(face.mPositions[j], n);
gGL.diffuseColor4f(1,1,1,1);
gGL.vertex3fv(face.mPositions[j].getF32ptr());
gGL.vertex3fv(p.getF32ptr());
if (face.mBinormals)
{
n.setMul(face.mBinormals[j], scale);
p.setAdd(face.mPositions[j], n);
gGL.diffuseColor4f(0,1,1,1);
gGL.vertex3fv(face.mPositions[j].getF32ptr());
gGL.vertex3fv(p.getF32ptr());
}
gGL.end();
}
}
gGL.popMatrix();
}
}
S32 get_physics_detail(const LLVolumeParams& volume_params, const LLVector3& scale)
{
const S32 DEFAULT_DETAIL = 1;
const F32 LARGE_THRESHOLD = 5.f;
const F32 MEGA_THRESHOLD = 25.f;
S32 detail = DEFAULT_DETAIL;
F32 avg_scale = (scale[0]+scale[1]+scale[2])/3.f;
if (avg_scale > LARGE_THRESHOLD)
{
detail += 1;
if (avg_scale > MEGA_THRESHOLD)
{
detail += 1;
}
}
return detail;
}
void renderMeshBaseHull(LLVOVolume* volume, U32 data_mask, LLColor4& color, LLColor4& line_color)
{
LLUUID mesh_id = volume->getVolume()->getParams().getSculptID();
LLModel::Decomposition* decomp = gMeshRepo.getDecomposition(mesh_id);
const LLVector3 center(0,0,0);
const LLVector3 size(0.25f,0.25f,0.25f);
if (decomp)
{
if (!decomp->mBaseHullMesh.empty())
{
gGL.diffuseColor4fv(color.mV);
LLVertexBuffer::drawArrays(LLRender::TRIANGLES, decomp->mBaseHullMesh.mPositions, decomp->mBaseHullMesh.mNormals);
}
else
{
gMeshRepo.buildPhysicsMesh(*decomp);
gGL.diffuseColor4f(0,1,1,1);
drawBoxOutline(center, size);
}
}
else
{
gGL.diffuseColor3f(1,0,1);
drawBoxOutline(center, size);
}
}
void render_hull(LLModel::PhysicsMesh& mesh, const LLColor4& color, const LLColor4& line_color)
{
gGL.diffuseColor4fv(color.mV);
LLVertexBuffer::drawArrays(LLRender::TRIANGLES, mesh.mPositions, mesh.mNormals);
LLGLEnable offset(GL_POLYGON_OFFSET_LINE);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glPolygonOffset(3.f, 3.f);
glLineWidth(3.f);
gGL.diffuseColor4fv(line_color.mV);
LLVertexBuffer::drawArrays(LLRender::TRIANGLES, mesh.mPositions, mesh.mNormals);
glLineWidth(1.f);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
{
U8 physics_type = volume->getPhysicsShapeType();
if (physics_type == LLViewerObject::PHYSICS_SHAPE_NONE || volume->isFlexible())
{
return;
}
//not allowed to return at this point without rendering *something*
F32 threshold = gSavedSettings.getF32("ObjectCostHighThreshold");
F32 cost = volume->getObjectCost();
LLColor4 low = gSavedSettings.getColor4("ObjectCostLowColor");
LLColor4 mid = gSavedSettings.getColor4("ObjectCostMidColor");
LLColor4 high = gSavedSettings.getColor4("ObjectCostHighColor");
F32 normalizedCost = 1.f - exp( -(cost / threshold) );
LLColor4 color;
if ( normalizedCost <= 0.5f )
{
color = lerp( low, mid, 2.f * normalizedCost );
}
else
{
color = lerp( mid, high, 2.f * ( normalizedCost - 0.5f ) );
}
LLColor4 line_color = color*0.5f;
U32 data_mask = LLVertexBuffer::MAP_VERTEX;
LLVolumeParams volume_params = volume->getVolume()->getParams();
LLPhysicsVolumeParams physics_params(volume_params,
physics_type == LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification physics_spec;
LLPhysicsShapeBuilderUtil::determinePhysicsShape(physics_params, volume->getScale(), physics_spec);
U32 type = physics_spec.getType();
LLVector3 center(0,0,0);
LLVector3 size(0.25f,0.25f,0.25f);
gGL.pushMatrix();
gGL.multMatrix((F32*) volume->getRelativeXform().mMatrix);
if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::USER_MESH)
{
//Skip. no
LLUUID mesh_id = volume->getVolume()->getParams().getSculptID();
LLModel::Decomposition* decomp = gMeshRepo.getDecomposition(mesh_id);
if (decomp)
{ //render a physics based mesh
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
if (!decomp->mHull.empty())
{ //decomposition exists, use that
if (decomp->mMesh.empty())
{
gMeshRepo.buildPhysicsMesh(*decomp);
}
for (U32 i = 0; i < decomp->mMesh.size(); ++i)
{
render_hull(decomp->mMesh[i], color, line_color);
}
}
else if (!decomp->mPhysicsShapeMesh.empty())
{
//decomp has physics mesh, render that mesh
gGL.diffuseColor4fv(color.mV);
LLVertexBuffer::drawArrays(LLRender::TRIANGLES, decomp->mPhysicsShapeMesh.mPositions, decomp->mPhysicsShapeMesh.mNormals);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
gGL.diffuseColor4fv(line_color.mV);
LLVertexBuffer::drawArrays(LLRender::TRIANGLES, decomp->mPhysicsShapeMesh.mPositions, decomp->mPhysicsShapeMesh.mNormals);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
else
{ //no mesh or decomposition, render base hull
renderMeshBaseHull(volume, data_mask, color, line_color);
if (decomp->mPhysicsShapeMesh.empty())
{
//attempt to fetch physics shape mesh if available
gMeshRepo.fetchPhysicsShape(mesh_id);
}
}
}
else
{
gGL.diffuseColor3f(1,1,0);
drawBoxOutline(center, size);
}
}
else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::USER_CONVEX ||
type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::PRIM_CONVEX)
{
if (volume->isMesh())
{
renderMeshBaseHull(volume, data_mask, color, line_color);
}
/*else
{
LLVolumeParams volume_params = volume->getVolume()->getParams();
S32 detail = get_physics_detail(volume_params, volume->getScale());
LLVolume* phys_volume = LLPrimitive::getVolumeManager()->refVolume(volume_params, detail);
if (!phys_volume->mHullPoints)
{ //build convex hull
std::vector<LLVector3> pos;
std::vector<U16> index;
S32 index_offset = 0;
for (S32 i = 0; i < phys_volume->getNumVolumeFaces(); ++i)
{
const LLVolumeFace& face = phys_volume->getVolumeFace(i);
if (index_offset + face.mNumVertices > 65535)
{
continue;
}
for (S32 j = 0; j < face.mNumVertices; ++j)
{
pos.push_back(LLVector3(face.mPositions[j].getF32ptr()));
}
for (S32 j = 0; j < face.mNumIndices; ++j)
{
index.push_back(face.mIndices[j]+index_offset);
}
index_offset += face.mNumVertices;
}
if (!pos.empty() && !index.empty())
{
LLCDMeshData mesh;
mesh.mIndexBase = &index[0];
mesh.mVertexBase = pos[0].mV;
mesh.mNumVertices = pos.size();
mesh.mVertexStrideBytes = 12;
mesh.mIndexStrideBytes = 6;
mesh.mIndexType = LLCDMeshData::INT_16;
mesh.mNumTriangles = index.size()/3;
LLCDMeshData res;
LLConvexDecomposition::getInstance()->generateSingleHullMeshFromMesh( &mesh, &res );
//copy res into phys_volume
phys_volume->mHullPoints = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*res.mNumVertices);
phys_volume->mNumHullPoints = res.mNumVertices;
S32 idx_size = (res.mNumTriangles*3*2+0xF) & ~0xF;
phys_volume->mHullIndices = (U16*) ll_aligned_malloc_16(idx_size);
phys_volume->mNumHullIndices = res.mNumTriangles*3;
const F32* v = res.mVertexBase;
for (S32 i = 0; i < res.mNumVertices; ++i)
{
F32* p = (F32*) ((U8*)v+i*res.mVertexStrideBytes);
phys_volume->mHullPoints[i].load3(p);
}
if (res.mIndexType == LLCDMeshData::INT_16)
{
for (S32 i = 0; i < res.mNumTriangles; ++i)
{
U16* idx = (U16*) (((U8*)res.mIndexBase)+i*res.mIndexStrideBytes);
phys_volume->mHullIndices[i*3+0] = idx[0];
phys_volume->mHullIndices[i*3+1] = idx[1];
phys_volume->mHullIndices[i*3+2] = idx[2];
}
}
else
{
for (S32 i = 0; i < res.mNumTriangles; ++i)
{
U32* idx = (U32*) (((U8*)res.mIndexBase)+i*res.mIndexStrideBytes);
phys_volume->mHullIndices[i*3+0] = (U16) idx[0];
phys_volume->mHullIndices[i*3+1] = (U16) idx[1];
phys_volume->mHullIndices[i*3+2] = (U16) idx[2];
}
}
}
}
if (phys_volume->mHullPoints)
{
//render hull
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
gGL.diffuseColor4fv(line_color.mV);
LLVertexBuffer::unbind();
llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShader != 0);
LLVertexBuffer::drawElements(LLRender::TRIANGLES, phys_volume->mHullPoints, NULL, phys_volume->mNumHullIndices, phys_volume->mHullIndices);
gGL.diffuseColor4fv(color.mV);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
LLVertexBuffer::drawElements(LLRender::TRIANGLES, phys_volume->mHullPoints, NULL, phys_volume->mNumHullIndices, phys_volume->mHullIndices);
}
else
{
gGL.diffuseColor4f(1,0,1,1);
drawBoxOutline(center, size);
}
LLPrimitive::sVolumeManager->unrefVolume(phys_volume);
}*/
}
else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::BOX)
{
LLVector3 center = physics_spec.getCenter();
LLVector3 scale = physics_spec.getScale();
LLVector3 vscale = volume->getScale()*2.f;
scale.set(scale[0]/vscale[0], scale[1]/vscale[1], scale[2]/vscale[2]);
gGL.diffuseColor4fv(color.mV);
drawBox(center, scale);
}
else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::SPHERE)
{
/*LLVolumeParams volume_params;
volume_params.setType( LL_PCODE_PROFILE_CIRCLE_HALF, LL_PCODE_PATH_CIRCLE );
volume_params.setBeginAndEndS( 0.f, 1.f );
volume_params.setBeginAndEndT( 0.f, 1.f );
volume_params.setRatio ( 1, 1 );
volume_params.setShear ( 0, 0 );
LLVolume* sphere = LLPrimitive::sVolumeManager->refVolume(volume_params, 3);
gGL.diffuseColor4fv(color.mV);
pushVerts(sphere);
LLPrimitive::sVolumeManager->unrefVolume(sphere);*/
}
else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::CYLINDER)
{
LLVolumeParams volume_params;
volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE );
volume_params.setBeginAndEndS( 0.f, 1.f );
volume_params.setBeginAndEndT( 0.f, 1.f );
volume_params.setRatio ( 1, 1 );
volume_params.setShear ( 0, 0 );
LLVolume* cylinder = LLPrimitive::getVolumeManager()->refVolume(volume_params, 3);
gGL.diffuseColor4fv(color.mV);
pushVerts(cylinder);
LLPrimitive::getVolumeManager()->unrefVolume(cylinder);
}
else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::PRIM_MESH)
{
LLVolumeParams volume_params = volume->getVolume()->getParams();
S32 detail = get_physics_detail(volume_params, volume->getScale());
LLVolume* phys_volume = LLPrimitive::getVolumeManager()->refVolume(volume_params, detail);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
gGL.diffuseColor4fv(line_color.mV);
pushVerts(phys_volume);
gGL.diffuseColor4fv(color.mV);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
pushVerts(phys_volume);
LLPrimitive::getVolumeManager()->unrefVolume(phys_volume);
}
else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::PRIM_CONVEX)
{
LLVolumeParams volume_params = volume->getVolume()->getParams();
S32 detail = get_physics_detail(volume_params, volume->getScale());
LLVolume* phys_volume = LLPrimitive::getVolumeManager()->refVolume(volume_params, detail);
if (phys_volume->mHullPoints && phys_volume->mHullIndices)
{
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShader != 0);
LLVertexBuffer::unbind();
glVertexPointer(3, GL_FLOAT, 16, phys_volume->mHullPoints);
gGL.diffuseColor4fv(line_color.mV);
gGL.syncMatrices();
glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices);
gGL.diffuseColor4fv(color.mV);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices);
}
else
{
gGL.diffuseColor3f(1,0,1);
drawBoxOutline(center, size);
gMeshRepo.buildHull(volume_params, detail);
}
LLPrimitive::getVolumeManager()->unrefVolume(phys_volume);
}
else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::SCULPT)
{
//TODO: implement sculpted prim physics display
}
else
{
llerrs << "Unhandled type" << llendl;
}
gGL.popMatrix();
}
void renderPhysicsShapes(LLSpatialGroup* group)
{
for (LLSpatialGroup::OctreeNode::const_element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
{
LLDrawable* drawable = *i;
LLVOVolume* volume = drawable->getVOVolume();
if (volume && !volume->isAttachment() && volume->getPhysicsShapeType() != LLViewerObject::PHYSICS_SHAPE_NONE )
{
if (!group->mSpatialPartition->isBridge())
{
gGL.pushMatrix();
LLVector3 trans = drawable->getRegion()->getOriginAgent();
gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]);
renderPhysicsShape(drawable, volume);
gGL.popMatrix();
}
else
{
renderPhysicsShape(drawable, volume);
}
}
else
{
LLViewerObject* object = drawable->getVObj();
if (object && object->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH)
{
//push face vertices for terrain
for (S32 i = 0; i < drawable->getNumFaces(); ++i)
{
LLFace* face = drawable->getFace(i);
LLVertexBuffer* buff = face->getVertexBuffer();
if (buff)
{
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
gGL.diffuseColor3f(0.2f, 0.5f, 0.3f);
buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
gGL.diffuseColor3f(0.2f, 1.f, 0.3f);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
}
}
}
}
}
}
void renderTexturePriority(LLDrawable* drawable)
@@ -2908,6 +3511,43 @@ void renderBatchSize(LLDrawInfo* params)
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
void renderShadowFrusta(LLDrawInfo* params)
{
LLGLEnable blend(GL_BLEND);
gGL.setSceneBlendType(LLRender::BT_ADD);
LLVector4a center;
center.setAdd(params->mExtents[1], params->mExtents[0]);
center.mul(0.5f);
LLVector4a size;
size.setSub(params->mExtents[1],params->mExtents[0]);
size.mul(0.5f);
if (gPipeline.mShadowCamera[4].AABBInFrustum(center, size))
{
gGL.diffuseColor3f(1,0,0);
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
if (gPipeline.mShadowCamera[5].AABBInFrustum(center, size))
{
gGL.diffuseColor3f(0,1,0);
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
if (gPipeline.mShadowCamera[6].AABBInFrustum(center, size))
{
gGL.diffuseColor3f(0,0,1);
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
if (gPipeline.mShadowCamera[7].AABBInFrustum(center, size))
{
gGL.diffuseColor3f(1,0,1);
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
void renderLights(LLDrawable* drawablep)
{
if (!drawablep->isLight())
@@ -3248,11 +3888,16 @@ public:
for (LLSpatialGroup::OctreeNode::const_element_iter i = branch->getData().begin(); i != branch->getData().end(); ++i)
{
LLDrawable* drawable = *i;
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_BBOXES))
{
renderBoundingBox(drawable);
}
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_NORMALS))
{
renderNormals(drawable);
}
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_BUILD_QUEUE))
{
@@ -3293,6 +3938,10 @@ public:
{
renderUpdateType(drawable);
}
if(gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_RENDER_COMPLEXITY))
{
renderComplexityDisplay(drawable);
}
LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(drawable->getVObj().get());
@@ -3344,11 +3993,50 @@ public:
{
renderBatchSize(draw_info);
}
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
{
renderShadowFrusta(draw_info);
}
}
}
}
};
class LLOctreeRenderPhysicsShapes : public LLOctreeTraveler<LLDrawable>
{
public:
LLCamera* mCamera;
LLOctreeRenderPhysicsShapes(LLCamera* camera): mCamera(camera) {}
virtual void traverse(const LLSpatialGroup::OctreeNode* node)
{
LLSpatialGroup* group = (LLSpatialGroup*) node->getListener(0);
if (!mCamera || mCamera->AABBInFrustumNoFarClip(group->mBounds[0], group->mBounds[1]))
{
node->accept(this);
stop_glerror();
for (U32 i = 0; i < node->getChildCount(); i++)
{
traverse(node->getChild(i));
stop_glerror();
}
group->rebuildGeom();
group->rebuildMesh();
renderPhysicsShapes(group);
}
}
virtual void visit(const LLSpatialGroup::OctreeNode* branch)
{
}
};
class LLOctreePushBBoxVerts : public LLOctreeTraveler<LLDrawable>
{
public:
@@ -3467,6 +4155,25 @@ public:
};
void LLSpatialPartition::renderPhysicsShapes()
{
LLSpatialBridge* bridge = asBridge();
LLCamera* camera = LLViewerCamera::getInstance();
if (bridge)
{
camera = NULL;
}
gGL.flush();
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
glLineWidth(3.f);
LLOctreeRenderPhysicsShapes render_physics(camera);
render_physics.traverse(mOctree);
gGL.flush();
glLineWidth(1.f);
}
void LLSpatialPartition::renderDebug()
{
if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_OCTREE |
@@ -3475,13 +4182,16 @@ void LLSpatialPartition::renderDebug()
LLPipeline::RENDER_DEBUG_BATCH_SIZE |
LLPipeline::RENDER_DEBUG_UPDATE_TYPE |
LLPipeline::RENDER_DEBUG_BBOXES |
LLPipeline::RENDER_DEBUG_NORMALS |
LLPipeline::RENDER_DEBUG_POINTS |
LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY |
LLPipeline::RENDER_DEBUG_TEXTURE_ANIM |
LLPipeline::RENDER_DEBUG_RAYCAST |
LLPipeline::RENDER_DEBUG_AVATAR_VOLUME |
LLPipeline::RENDER_DEBUG_AGENT_TARGET |
LLPipeline::RENDER_DEBUG_BUILD_QUEUE))
//LLPipeline::RENDER_DEBUG_BUILD_QUEUE |
LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA |
LLPipeline::RENDER_DEBUG_RENDER_COMPLEXITY))
{
return;
}

View File

@@ -376,6 +376,9 @@ public:
bridge_list_t mBridgeList;
buffer_map_t mBufferMap; //used by volume buffers to store unique buffers per texture
U32 mGeometryBytes; //used by volumes to track how many bytes of geometry data are in this node
F32 mSurfaceArea; //used by volumes to track estimated surface area of geometry in this node
F32 mBuilt;
OctreeNode* mOctreeNode;
LLSpatialPartition* mSpatialPartition;
@@ -455,9 +458,10 @@ public:
BOOL isVisible(const LLVector3& v);
bool isHUDPartition() ;
virtual LLSpatialBridge* asBridge() { return NULL; }
virtual BOOL isBridge() { return asBridge() != NULL; }
LLSpatialBridge* asBridge() { return mBridge; }
BOOL isBridge() { return asBridge() != NULL; }
void renderPhysicsShapes();
void renderDebug();
void renderIntersectingBBoxes(LLCamera* camera);
void restoreGL();
@@ -467,6 +471,9 @@ public:
public:
LLSpatialGroup::OctreeNode* mOctree;
LLSpatialBridge* mBridge; // NULL for non-LLSpatialBridge instances, otherwise, mBridge == this
// use a pointer instead of making "isBridge" and "asBridge" virtual so it's safe
// to call asBridge() from the destructor
BOOL mOcclusionEnabled; // if TRUE, occlusion culling is performed
BOOL mInfiniteFarClip; // if TRUE, frustum culling ignores far clip plane
U32 mBufferUsage;
@@ -491,8 +498,9 @@ public:
LLSpatialBridge(LLDrawable* root, BOOL render_by_group, U32 data_mask);
virtual BOOL isSpatialBridge() const { return TRUE; }
void destroyTree();
virtual BOOL isSpatialBridge() const { return TRUE; }
virtual void updateSpatialExtents();
virtual void updateBinRadius();
virtual void setVisible(LLCamera& camera_in, std::vector<LLDrawable*>* results = NULL, BOOL for_select = FALSE);
@@ -503,11 +511,11 @@ public:
virtual void shiftPos(const LLVector4a& vec);
virtual void cleanupReferences();
virtual LLSpatialPartition* asPartition() { return this; }
virtual LLSpatialBridge* asBridge() { return this; }
virtual LLCamera transformCamera(LLCamera& camera);
LLDrawable* mDrawable;
LLPointer<LLVOAvatar> mAvatar;
};
class LLCullResult

View File

@@ -885,7 +885,7 @@ BOOL LLTextureCache::isInLocal(const LLUUID& id)
//static
const S32 MAX_REASONABLE_FILE_SIZE = 512*1024*1024; // 512 MB
F32 LLTextureCache::sHeaderCacheVersion = 1.4f;
F32 LLTextureCache::sHeaderCacheVersion = 1.5f;
U32 LLTextureCache::sCacheMaxEntries = MAX_REASONABLE_FILE_SIZE / TEXTURE_CACHE_ENTRY_SIZE;
S64 LLTextureCache::sCacheMaxTexturesSize = 0; // no limit
const char* entries_filename = "texture.entries";

View File

@@ -283,7 +283,10 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot, boo
stop_glerror();
gPipeline.disableLights();
//reset vertex buffers if needed
gPipeline.doResetVertexBuffers();
stop_glerror();
// Don't draw if the window is hidden or minimized.
@@ -761,6 +764,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot, boo
{
LLAppViewer::instance()->pingMainloopTimeout("Display:Imagery");
gPipeline.generateWaterReflection(*LLViewerCamera::getInstance());
gPipeline.renderPhysicsDisplay();
}
LLGLState::checkStates();

View File

@@ -63,7 +63,6 @@ extern PFNGLWEIGHTFVARBPROC glWeightfvARB;
extern PFNGLVERTEXBLENDARBPROC glVertexBlendARB;
#endif
static LLPointer<LLVertexBuffer> sRenderBuffer = NULL;
static const U32 sRenderMask = LLVertexBuffer::MAP_VERTEX |
LLVertexBuffer::MAP_NORMAL |
LLVertexBuffer::MAP_TEXCOORD0;

View File

@@ -1489,6 +1489,21 @@ void init_debug_rendering_menu(LLMenuGL* menu)
sub_menu->append(new LLMenuItemCheckGL("Update Types", &LLPipeline::toggleRenderDebug, NULL,
&LLPipeline::toggleRenderDebugControl,
(void*)LLPipeline::RENDER_DEBUG_UPDATE_TYPE));
sub_menu->append(new LLMenuItemCheckGL("Physics Shapes", &LLPipeline::toggleRenderDebug, NULL,
&LLPipeline::toggleRenderDebugControl,
(void*)LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES));
sub_menu->append(new LLMenuItemCheckGL("Normals", &LLPipeline::toggleRenderDebug, NULL,
&LLPipeline::toggleRenderDebugControl,
(void*)LLPipeline::RENDER_DEBUG_NORMALS));
sub_menu->append(new LLMenuItemCheckGL("LOD Info", &LLPipeline::toggleRenderDebug, NULL,
&LLPipeline::toggleRenderDebugControl,
(void*)LLPipeline::RENDER_DEBUG_LOD_INFO));
sub_menu->append(new LLMenuItemCheckGL("Wind Vectors", &LLPipeline::toggleRenderDebug, NULL,
&LLPipeline::toggleRenderDebugControl,
(void*)LLPipeline::RENDER_DEBUG_WIND_VECTORS));
sub_menu->append(new LLMenuItemCheckGL("Complexity", &LLPipeline::toggleRenderDebug, NULL,
&LLPipeline::toggleRenderDebugControl,
(void*)LLPipeline::RENDER_DEBUG_RENDER_COMPLEXITY)); ;
sub_menu = new LLMenuGL("Render Tests");
@@ -1632,6 +1647,10 @@ void init_debug_avatar_menu(LLMenuGL* menu)
&LLPipeline::toggleRenderDebug, NULL,
&LLPipeline::toggleRenderDebugControl,
(void*)LLPipeline::RENDER_DEBUG_AGENT_TARGET));
menu->append(new LLMenuItemCheckGL("Attachment Bytes",
&LLPipeline::toggleRenderDebug, NULL,
&LLPipeline::toggleRenderDebugControl,
(void*)LLPipeline::RENDER_DEBUG_ATTACHMENT_BYTES));
menu->append(new LLMenuItemToggleGL( "Debug Rotation", &LLVOAvatar::sDebugAvatarRotation));
menu->append(new LLMenuItemCallGL("Dump Attachments", handle_dump_attachments));
menu->append(new LLMenuItemCallGL("Rebake Textures", handle_rebake_textures, NULL, NULL, 'R', MASK_ALT | MASK_CONTROL ));

View File

@@ -318,9 +318,13 @@ void LLViewerShaderMgr::setShaders()
LLGLSLShader::sIndexedTextureChannels = llmin(LLGLSLShader::sIndexedTextureChannels, 16);
reentrance = true;
if (gGLManager.mGLVersion < 2.f)
{ //NEVER use shaders on a pre 2.0 context
gSavedSettings.setBOOL("VertexShaderEnable", FALSE);
if (LLRender::sGLCoreProfile)
{
if (!gSavedSettings.getBOOL("VertexShaderEnable"))
{ //vertex shaders MUST be enabled to use core profile
gSavedSettings.setBOOL("VertexShaderEnable", TRUE);
}
}
//setup preprocessor definitions
@@ -983,19 +987,25 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
gDeferredSkinnedAlphaProgram.mName = "Deferred Skinned Alpha Shader";
gDeferredSkinnedAlphaProgram.mFeatures.atmosphericHelpers = true;
gDeferredSkinnedAlphaProgram.mFeatures.hasObjectSkinning = true;
gDeferredSkinnedAlphaProgram.mFeatures.calculatesAtmospherics = true;
gDeferredSkinnedAlphaProgram.mFeatures.hasGamma = true;
gDeferredSkinnedAlphaProgram.mFeatures.hasAtmospherics = true;
gDeferredSkinnedAlphaProgram.mFeatures.calculatesLighting = true;
gDeferredSkinnedAlphaProgram.mFeatures.hasLighting = true;
gDeferredSkinnedAlphaProgram.mFeatures.calculatesLighting = false;
gDeferredSkinnedAlphaProgram.mFeatures.hasLighting = false;
gDeferredSkinnedAlphaProgram.mFeatures.isAlphaLighting = true;
gDeferredSkinnedAlphaProgram.mFeatures.disableTextureIndex = true;
gDeferredSkinnedAlphaProgram.mShaderFiles.clear();
gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredSkinnedAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaNonIndexedF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredSkinnedAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredSkinnedAlphaProgram.createShader(NULL, NULL);
// Hack to include uniforms for lighting without linking in lighting file
gDeferredSkinnedAlphaProgram.mFeatures.calculatesLighting = true;
gDeferredSkinnedAlphaProgram.mFeatures.hasLighting = true;
}
if (success)
@@ -1112,11 +1122,12 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
gDeferredAlphaProgram.mName = "Deferred Alpha Shader";
gDeferredAlphaProgram.mFeatures.calculatesLighting = true;
gDeferredAlphaProgram.mFeatures.atmosphericHelpers = true;
gDeferredAlphaProgram.mFeatures.calculatesLighting = false;
gDeferredAlphaProgram.mFeatures.calculatesAtmospherics = true;
gDeferredAlphaProgram.mFeatures.hasGamma = true;
gDeferredAlphaProgram.mFeatures.hasAtmospherics = true;
gDeferredAlphaProgram.mFeatures.hasLighting = true;
gDeferredAlphaProgram.mFeatures.hasLighting = false;
gDeferredAlphaProgram.mFeatures.isAlphaLighting = true;
gDeferredAlphaProgram.mFeatures.disableTextureIndex = true; //hack to disable auto-setup of texture channels
if (mVertexShaderLevel[SHADER_DEFERRED] < 1)
@@ -1132,7 +1143,12 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredAlphaProgram.createShader(NULL, NULL);
// Hack
gDeferredAlphaProgram.mFeatures.calculatesLighting = true;
gDeferredAlphaProgram.mFeatures.hasLighting = true;
}
if (success)
@@ -1261,19 +1277,24 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
gDeferredAvatarAlphaProgram.mName = "Avatar Alpha Shader";
gDeferredAvatarAlphaProgram.mFeatures.atmosphericHelpers = true;
gDeferredAvatarAlphaProgram.mFeatures.hasSkinning = true;
gDeferredAvatarAlphaProgram.mFeatures.calculatesLighting = true;
gDeferredAvatarAlphaProgram.mFeatures.calculatesLighting = false;
gDeferredAvatarAlphaProgram.mFeatures.calculatesAtmospherics = true;
gDeferredAvatarAlphaProgram.mFeatures.hasGamma = true;
gDeferredAvatarAlphaProgram.mFeatures.hasAtmospherics = true;
gDeferredAvatarAlphaProgram.mFeatures.hasLighting = true;
gDeferredAvatarAlphaProgram.mFeatures.hasLighting = false;
gDeferredAvatarAlphaProgram.mFeatures.isAlphaLighting = true;
gDeferredAvatarAlphaProgram.mFeatures.disableTextureIndex = true;
gDeferredAvatarAlphaProgram.mShaderFiles.clear();
gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/avatarAlphaV.glsl", GL_VERTEX_SHADER_ARB));
gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaNonIndexedNoColorF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredAvatarAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
success = gDeferredAvatarAlphaProgram.createShader(NULL, &mAvatarUniforms);
gDeferredAvatarAlphaProgram.mFeatures.calculatesLighting = true;
gDeferredAvatarAlphaProgram.mFeatures.hasLighting = true;
}
if (success)

View File

@@ -689,6 +689,8 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
LLViewerObject(id, pcode, regionp),
mIsDummy(FALSE),
mSpecialRenderMode(0),
mAttachmentGeometryBytes(0),
mAttachmentSurfaceArea(0.f),
mTurning(FALSE),
mPelvisToFoot(0.f),
mLastSkeletonSerialNum( 0 ),
@@ -1370,6 +1372,7 @@ void LLVOAvatar::initInstance(void)
mesh->setName(mesh_name);
mesh->setMeshID(mesh_index);
mesh->setPickName(mesh_dict->mPickName);
mesh->setIsTransparent(FALSE);
switch((int)mesh_index)
{
case MESH_ID_HAIR:
@@ -3255,6 +3258,29 @@ void LLVOAvatar::getClientInfo(std::string& client, LLColor4& color, BOOL useCom
return;
std::string uuid_str = getTE(TEX_HEAD_BODYPAINT)->getID().asString(); //UUID of the head texture
if(isFullyLoaded())
{
//Zwagoth's new client identification - HgB
// Overwrite the current tag/color settings if new method
// exists -- charbl.
const LLTextureEntry* texentry = getTE(0);
if(texentry->getGlow() > 0.0)
{
///llinfos << "Using new client identifier." << llendl;
U8 tag_buffer[UUID_BYTES+1];
memset(&tag_buffer, 0, UUID_BYTES);
memcpy(&tag_buffer[0], &texentry->getID().mData, UUID_BYTES);
tag_buffer[UUID_BYTES] = 0;
U32 tag_len = strlen((const char*)&tag_buffer[0]);
tag_len = (tag_len>UUID_BYTES) ? (UUID_BYTES) : tag_len;
client = std::string((char*)&tag_buffer[0], tag_len);
LLStringFn::replace_ascii_controlchars(mClientTag, LL_UNKNOWN_CHAR);
mNameString.clear();
color = texentry->getColor();
return;
}
}
static const LLCachedControl<LLColor4> avatar_name_color(gColors,"AvatarNameColor",LLColor4(LLColor4U(251, 175, 93, 255)) );
if (isSelf())
{
@@ -3550,38 +3576,15 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
LLColor4 avatar_name_color = gColors.getColor( "AvatarNameColor" );
//As pointed out by Zwagoth, we really shouldn't be doing this per-frame. Skip if we already have the data. -HgB
if (mClientTag == "")
{
mClientColor = gColors.getColor( "AvatarNameColor" );
if(isFullyLoaded())
getClientInfo(mClientTag,mClientColor);
if(mClientTag == "")
{
//Zwagoth's new client identification - HgB
// Overwrite the current tag/color settings if new method
// exists -- charbl.
const LLTextureEntry* texentry = getTE(0);
if(texentry->getGlow() > 0.0)
{
llinfos << "Using new client identifier." << llendl;
U8 tag_buffer[UUID_BYTES+1];
memset(&tag_buffer, 0, UUID_BYTES);
memcpy(&tag_buffer[0], &texentry->getID().mData, UUID_BYTES);
tag_buffer[UUID_BYTES] = 0;
U32 tag_len = strlen((const char*)&tag_buffer[0]);
tag_len = (tag_len>UUID_BYTES) ? (UUID_BYTES) : tag_len;
mClientTag = std::string((char*)&tag_buffer[0], tag_len);
LLStringFn::replace_ascii_controlchars(mClientTag, LL_UNKNOWN_CHAR);
mNameString.clear();
mClientColor = texentry->getColor();
}
else
{
//llinfos << "Using Emerald-style client identifier." << llendl;
//The old client identification. Used only if the new method doesn't exist, so that it isn't automatically overwritten. -HgB
getClientInfo(mClientTag,mClientColor);
if(mClientTag == "")
client = "?"; //prevent console spam..
}
client = "?"; //prevent console spam..
}
// Overwrite the tag/color shit yet again if we want to see
@@ -4044,6 +4047,16 @@ void LLVOAvatar::slamPosition()
mRoot.updateWorldMatrixChildren();
}
bool LLVOAvatar::isVisuallyMuted()
{
static LLCachedControl<U32> max_attachment_bytes(gSavedSettings, "RenderAutoMuteByteLimit");
static LLCachedControl<F32> max_attachment_area(gSavedSettings, "RenderAutoMuteSurfaceAreaLimit");
return LLMuteList::getInstance()->isMuted(getID()) ||
(mAttachmentGeometryBytes > max_attachment_bytes && max_attachment_bytes > 0) ||
(mAttachmentSurfaceArea > max_attachment_area && max_attachment_area > 0.f);
}
//------------------------------------------------------------------------
// updateCharacter()
// called on both your avatar and other avatars
@@ -4119,8 +4132,9 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
size.setSub(ext[1],ext[0]);
F32 mag = size.getLength3().getF32()*0.5f;
F32 impostor_area = 256.f*512.f*(8.125f - LLVOAvatar::sLODFactor*8.f);
if (LLMuteList::getInstance()->isMuted(getID()))
if (isVisuallyMuted())
{ // muted avatars update at 16 hz
mUpdatePeriod = 16;
}
@@ -5234,6 +5248,7 @@ void LLVOAvatar::updateTextures()
}
}
}
}
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA))
@@ -10426,19 +10441,41 @@ void LLVOAvatar::getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& d
void LLVOAvatar::idleUpdateRenderCost()
{
static const U32 ARC_BODY_PART_COST = 200;
static const U32 ARC_LIMIT = 20000;
static std::set<LLUUID> all_textures;
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_ATTACHMENT_BYTES))
{ //set debug text to attachment geometry bytes here so render cost will override
setDebugText(llformat("%.1f KB, %.2f m^2", mAttachmentGeometryBytes/1024.f, mAttachmentSurfaceArea));
}
if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME))
{
return;
}
U32 shame = 1;
U32 cost = 0;
LLVOVolume::texture_cost_t textures;
std::set<LLUUID> textures;
for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)
{
const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index);
ETextureIndex tex_index = baked_dict->mTextureIndex;
if ((tex_index != TEX_SKIRT_BAKED) || (isWearingWearableType(LLWearableType::WT_SKIRT)))
{
if (isTextureVisible(tex_index))
{
cost +=ARC_BODY_PART_COST;
}
}
}
attachment_map_t::const_iterator iter;
for (iter = mAttachmentPoints.begin();
iter != mAttachmentPoints.end();
++iter)
for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin();
iter != mAttachmentPoints.end();
++iter)
{
LLViewerJointAttachment* attachment = iter->second;
for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
@@ -10448,52 +10485,89 @@ void LLVOAvatar::idleUpdateRenderCost()
const LLViewerObject* attached_object = (*attachment_iter);
if (attached_object && !attached_object->isHUDAttachment())
{
textures.clear();
const LLDrawable* drawable = attached_object->mDrawable;
if (drawable)
{
shame += 10;
LLVOVolume* volume = drawable->getVOVolume();
const LLVOVolume* volume = drawable->getVOVolume();
if (volume)
{
shame += calc_shame(volume, textures);
cost += volume->getRenderCost(textures);
const_child_list_t children = volume->getChildren();
for (const_child_list_t::const_iterator child_iter = children.begin();
child_iter != children.end();
++child_iter)
{
LLViewerObject* child_obj = *child_iter;
LLVOVolume *child = dynamic_cast<LLVOVolume*>( child_obj );
if (child)
{
cost += child->getRenderCost(textures);
}
}
for (LLVOVolume::texture_cost_t::iterator iter = textures.begin(); iter != textures.end(); ++iter)
{
// add the cost of each individual texture in the linkset
cost += iter->second;
}
}
}
}
}
}
if(sDoProperArc)
}
// Diagnostic output to identify all avatar-related textures.
// Does not affect rendering cost calculation.
// Could be wrapped in a debug option if output becomes problematic.
if (isSelf())
{
std::set<LLUUID>::const_iterator tex_iter;
for(tex_iter = textures.begin();tex_iter != textures.end();++tex_iter)
// print any attachment textures we didn't already know about.
for (LLVOVolume::texture_cost_t::iterator it = textures.begin(); it != textures.end(); ++it)
{
LLViewerTexture* img = LLViewerTextureManager::getFetchedTexture(*tex_iter);
if(img)
LLUUID image_id = it->first;
if( image_id.isNull() || image_id == IMG_DEFAULT || image_id == IMG_DEFAULT_AVATAR)
continue;
if (all_textures.find(image_id) == all_textures.end())
{
shame += (img->getHeight() * img->getWidth()) >> 4;
// attachment texture not previously seen.
llinfos << "attachment_texture: " << image_id.asString() << llendl;
all_textures.insert(image_id);
}
}
// print any avatar textures we didn't already know about
for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
++iter)
{
const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
// TODO: MULTI-WEARABLE: handle multiple textures for self
const LLViewerTexture* te_image = getTEImage(iter->first);//getImage(iter->first,0);
if (!te_image)
continue;
LLUUID image_id = te_image->getID();
if( image_id.isNull() || image_id == IMG_DEFAULT || image_id == IMG_DEFAULT_AVATAR)
continue;
if (all_textures.find(image_id) == all_textures.end())
{
llinfos << "local_texture: " << texture_dict->mName << ": " << image_id << llendl;
all_textures.insert(image_id);
}
}
}
shame += textures.size() * 5;
setDebugText(llformat("%d", shame));
F32 green = 1.f-llclamp(((F32) shame-1024.f)/1024.f, 0.f, 1.f);
F32 red = llmin((F32) shame/1024.f, 1.f);
if(sDoProperArc)
{
green = 1.f-llclamp(((F32)shame-1000000.f)/1000000.f, 0.f, 1.f);
red = llmin((F32)shame/1000000.f, 1.f);
}
else
{
green = 1.f-llclamp(((F32)shame-1024.f)/1024.f, 0.f, 1.f);
red = llmin((F32)shame/1024.f, 1.f);
}
setDebugText(llformat("%d", cost));
mVisualComplexity = cost;
F32 green = 1.f-llclamp(((F32) cost-(F32)ARC_LIMIT)/(F32)ARC_LIMIT, 0.f, 1.f);
F32 red = llmin((F32) cost/(F32)ARC_LIMIT, 1.f);
mText->setColor(LLColor4(red,green,0,1));
}
// static
BOOL LLVOAvatar::isIndexLocalTexture(ETextureIndex index)
{

View File

@@ -287,6 +287,7 @@ private:
BOOL mPreviousFullyLoaded;
BOOL mFullyLoadedInitialized;
S32 mFullyLoadedFrameCounter;
S32 mVisualComplexity;
LLFrameTimer mFullyLoadedTimer;
LLFrameTimer mRuthTimer;
@@ -379,6 +380,8 @@ public:
// Graphical stuff for objects - maybe broken out into render class later?
U32 renderFootShadows();
U32 renderImpostor(LLColor4U color = LLColor4U(255,255,255,255), S32 diffuse_channel = 0);
bool isVisuallyMuted();
U32 renderRigid();
U32 renderSkinned(EAvatarRenderPass pass);
F32 getLastSkinTime() { return mLastSkinTime; }
@@ -390,6 +393,9 @@ public:
static void restoreGL();
BOOL mIsDummy; // for special views
S32 mSpecialRenderMode; // special lighting
U32 mAttachmentGeometryBytes; //number of bytes in attached geometry
F32 mAttachmentSurfaceArea; //estimated surface area of attachments
private:
bool shouldAlphaMask();

View File

@@ -46,7 +46,6 @@
#include "llsurface.h"
#include "llsurfacepatch.h"
#include "llvosky.h"
#include "llvotree.h"
#include "llviewercamera.h"
#include "llviewertexturelist.h"
#include "llviewerregion.h"
@@ -55,6 +54,7 @@
#include "llworld.h"
#include "lldir.h"
#include "llxmltree.h"
#include "llvotree.h"
const S32 GRASS_MAX_BLADES = 32;
const F32 GRASS_BLADE_BASE = 0.25f; // Width of grass at base

View File

@@ -1032,6 +1032,14 @@ BOOL LLVOVolume::calcLOD()
cur_detail = computeLODDetail(llround(distance, 0.01f),
llround(radius, 0.01f));
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_LOD_INFO))
{
//setDebugText(llformat("%.2f:%.2f, %d", debug_distance, radius, cur_detail));
setDebugText(llformat("%d", mDrawable->getFace(0)->getTextureIndex()));
}
if (cur_detail != mLOD)
{
mAppAngle = llround((F32) atan2( mDrawable->getRadius(), mDrawable->mDistanceWRTCamera) * RAD_TO_DEG, 0.01f);
@@ -3346,6 +3354,32 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
LLFastTimer ftm2(FTM_REBUILD_VOLUME_VB);
LLVOAvatar* pAvatarVO = NULL;
LLSpatialBridge* bridge = group->mSpatialPartition->asBridge();
if (bridge)
{
if (bridge->mAvatar.isNull())
{
LLViewerObject* vobj = bridge->mDrawable->getVObj();
if (vobj)
{
bridge->mAvatar = vobj->getAvatar();
}
}
pAvatarVO = bridge->mAvatar;
}
if (pAvatarVO)
{
pAvatarVO->mAttachmentGeometryBytes -= group->mGeometryBytes;
pAvatarVO->mAttachmentSurfaceArea -= group->mSurfaceArea;
}
group->mGeometryBytes = 0;
group->mSurfaceArea = 0;
group->clearDrawMap();
mFaceList.clear();
@@ -3384,12 +3418,24 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
LLVOVolume* vobj = drawablep->getVOVolume();
if (!vobj)
{
continue;
}
if (vobj->isMesh() &&
(vobj->getVolume() && !vobj->getVolume()->isMeshAssetLoaded() || !gMeshRepo.meshRezEnabled()))
{
continue;
}
LLVolume* volume = vobj->getVolume();
if (volume)
{
const LLVector3& scale = vobj->getScale();
group->mSurfaceArea += volume->getSurfaceArea() * llmax(llmax(scale.mV[0], scale.mV[1]), scale.mV[2]);
}
llassert_always(vobj);
vobj->updateTextureVirtualSize(true);
vobj->preRebuild();
@@ -3434,7 +3480,6 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
//Determine if we've received skininfo that contains an
//alternate bind matrix - if it does then apply the translational component
//to the joints of the avatar.
LLVOAvatar* pAvatarVO = vobj->getAvatar();
bool pelvisGotSet = false;
if ( pAvatarVO )
@@ -3504,13 +3549,16 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
if (type == LLDrawPool::POOL_ALPHA)
{
if (te->getFullbright())
if (te->getColor().mV[3] > 0.f)
{
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA);
}
else
{
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_ALPHA);
if (te->getFullbright())
{
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA);
}
else
{
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_ALPHA);
}
}
}
else if (te->getShiny())
@@ -3643,8 +3691,11 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
else
{
drawablep->setState(LLDrawable::HAS_ALPHA);
alpha_faces.push_back(facep);
if (te->getColor().mV[3] > 0.f)
{
drawablep->setState(LLDrawable::HAS_ALPHA);
alpha_faces.push_back(facep);
}
}
}
else
@@ -3761,6 +3812,12 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
mFaceList.clear();
if (pAvatarVO)
{
pAvatarVO->mAttachmentGeometryBytes += group->mGeometryBytes;
pAvatarVO->mAttachmentSurfaceArea += group->mSurfaceArea;
}
}
static LLFastTimer::DeclareTimer FTM_VOLUME_GEOM("Volume Geometry");
@@ -4102,6 +4159,9 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
}
}
group->mGeometryBytes += buffer->getSize() + buffer->getIndicesSize();
buffer_map[mask][*face_iter].push_back(buffer);
//add face geometry
@@ -4151,6 +4211,11 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
fullbright = TRUE;
}
if (hud_group)
{ //all hud attachments are fullbright
fullbright = TRUE;
}
const LLTextureEntry* te = facep->getTextureEntry();
tex = facep->getTexture();
@@ -4176,7 +4241,6 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
}
}
else if (gPipeline.canUseVertexShaders()
&& group->mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_HUD
&& LLPipeline::sRenderBump
&& te->getShiny())
{ //shiny
@@ -4241,9 +4305,11 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
}
}
//not sure why this is here -- shiny HUD attachments maybe? -- davep 5/11/2010
if (!is_alpha && te->getShiny() && LLPipeline::sRenderBump)
{
if (!gPipeline.canUseVertexShaders() &&
!is_alpha &&
te->getShiny() &&
LLPipeline::sRenderBump)
{ //shiny as an extra pass when shaders are disabled
registerFace(group, facep, LLRenderPass::PASS_SHINY);
}
}

View File

@@ -158,7 +158,7 @@ extern BOOL gDebugGL;
// hack counter for rendering a fixed number of frames after toggling
// fullscreen to work around DEV-5361
static S32 sDelayedVBOEnable = 0;
//static S32 sDelayedVBOEnable = 0;
BOOL gAvatarBacklight = FALSE;
@@ -295,7 +295,7 @@ BOOL LLPipeline::sRenderBeacons = FALSE;
BOOL LLPipeline::sRenderHighlight = TRUE;
BOOL LLPipeline::sForceOldBakedUpload = FALSE;
S32 LLPipeline::sUseOcclusion = 0;
BOOL LLPipeline::sDelayVBUpdate = TRUE;
BOOL LLPipeline::sDelayVBUpdate = FALSE;
BOOL LLPipeline::sAutoMaskAlphaDeferred = TRUE;
BOOL LLPipeline::sAutoMaskAlphaNonDeferred = FALSE;
BOOL LLPipeline::sDisableShaders = FALSE;
@@ -364,6 +364,7 @@ LLPipeline::LLPipeline() :
mOldRenderDebugMask(0),
mGroupQ1Locked(false),
mGroupQ2Locked(false),
mResetVertexBuffers(false),
mLastRebuildPool(NULL),
mAlphaPool(NULL),
mSkyPool(NULL),
@@ -455,7 +456,7 @@ void LLPipeline::init()
gSavedSettings.getControl("RenderAutoMaskAlphaNonDeferred")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
gSavedSettings.getControl("RenderUseFarClip")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
gSavedSettings.getControl("RenderAvatarMaxVisible")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
gSavedSettings.getControl("RenderDelayVBUpdate")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
//gSavedSettings.getControl("RenderDelayVBUpdate")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
}
@@ -555,7 +556,7 @@ void LLPipeline::destroyGL()
if (LLVertexBuffer::sEnableVBOs)
{
// render 30 frames after switching to work around DEV-5361
sDelayedVBOEnable = 30;
//sDelayedVBOEnable = 30;
LLVertexBuffer::sEnableVBOs = FALSE;
}
}
@@ -591,6 +592,17 @@ void LLPipeline::resizeScreenTexture()
}
}
void LLPipeline::allocatePhysicsBuffer()
{
GLuint resX = gViewerWindow->getWorldViewWidthRaw();
GLuint resY = gViewerWindow->getWorldViewHeightRaw();
if (mPhysicsDisplay.getWidth() != resX || mPhysicsDisplay.getHeight() != resY)
{
mPhysicsDisplay.allocate(resX, resY, GL_RGBA, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
}
}
void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
{
refreshCachedSettings();
@@ -790,7 +802,7 @@ void LLPipeline::refreshCachedSettings()
LLPipeline::sAutoMaskAlphaNonDeferred = gSavedSettings.getBOOL("RenderAutoMaskAlphaNonDeferred");
LLPipeline::sUseFarClip = gSavedSettings.getBOOL("RenderUseFarClip");
LLVOAvatar::sMaxVisible = (U32)gSavedSettings.getS32("RenderAvatarMaxVisible");
LLPipeline::sDelayVBUpdate = gSavedSettings.getBOOL("RenderDelayVBUpdate");
//LLPipeline::sDelayVBUpdate = gSavedSettings.getBOOL("RenderDelayVBUpdate");
LLPipeline::sUseOcclusion =
(!gUseWireframe
@@ -839,6 +851,7 @@ void LLPipeline::releaseScreenBuffers()
{
mScreen.release();
mFXAABuffer.release();
mPhysicsDisplay.release();
mDeferredScreen.release();
mDeferredDepth.release();
mDeferredLight.release();
@@ -2308,14 +2321,14 @@ void LLPipeline::updateGeom(F32 max_dtime)
assertInitialized();
if (sDelayedVBOEnable > 0)
/*if (sDelayedVBOEnable > 0)
{
if (--sDelayedVBOEnable <= 0)
{
resetVertexBuffers();
LLVertexBuffer::sEnableVBOs = TRUE;
}
}
}*/
// notify various object types to reset internal cost metrics, etc.
// for now, only LLVOVolume does this to throttle LOD changes
@@ -3993,6 +4006,69 @@ void LLPipeline::addTrianglesDrawn(S32 index_count, U32 render_type)
}
}
void LLPipeline::renderPhysicsDisplay()
{
if (!hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES))
{
return;
}
allocatePhysicsBuffer();
gGL.flush();
mPhysicsDisplay.bindTarget();
glClearColor(0,0,0,1);
gGL.setColorMask(true, true);
mPhysicsDisplay.clear();
glClearColor(0,0,0,0);
gGL.setColorMask(true, false);
if (LLGLSLShader::sNoFixedFunction)
{
gDebugProgram.bind();
}
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
{
LLViewerRegion* region = *iter;
for (U32 i = 0; i < LLViewerRegion::NUM_PARTITIONS; i++)
{
LLSpatialPartition* part = region->getSpatialPartition(i);
if (part)
{
if (hasRenderType(part->mDrawableType))
{
part->renderPhysicsShapes();
}
}
}
}
for (LLCullResult::bridge_list_t::const_iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
{
LLSpatialBridge* bridge = *i;
if (!bridge->isDead() && hasRenderType(bridge->mDrawableType))
{
gGL.pushMatrix();
gGL.multMatrix((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);
bridge->renderPhysicsShapes();
gGL.popMatrix();
}
}
gGL.flush();
if (LLGLSLShader::sNoFixedFunction)
{
gDebugProgram.unbind();
}
mPhysicsDisplay.flush();
}
void LLPipeline::renderDebug()
{
LLMemType mt(LLMemType::MTYPE_PIPELINE);
@@ -4956,7 +5032,8 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
light_state->setConstantAttenuation(0.f);
if (sRenderDeferred)
{
light_state->setLinearAttenuation(light_radius*1.5f);
F32 size = light_radius*1.5f;
light_state->setLinearAttenuation(size*size);
light_state->setQuadraticAttenuation(light->getLightFalloff()*0.5f+1.f);
}
else
@@ -5852,7 +5929,7 @@ LLSpatialPartition* LLPipeline::getSpatialPartition(LLViewerObject* vobj)
void LLPipeline::resetVertexBuffers(LLDrawable* drawable)
{
if (!drawable || drawable->isDead())
if (!drawable)
{
return;
}
@@ -5866,6 +5943,18 @@ void LLPipeline::resetVertexBuffers(LLDrawable* drawable)
void LLPipeline::resetVertexBuffers()
{
mResetVertexBuffers = true;
}
void LLPipeline::doResetVertexBuffers()
{
if (!mResetVertexBuffers)
{
return;
}
mResetVertexBuffers = false;
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
{
@@ -5891,11 +5980,9 @@ void LLPipeline::resetVertexBuffers()
if (LLVertexBuffer::sGLCount > 0)
{
llwarns << "VBO wipe failed." << llendl;
llwarns << "VBO wipe failed -- " << LLVertexBuffer::sGLCount << " buffers remaining." << llendl;
}
llassert(LLVertexBuffer::sGLCount == 0);
LLVertexBuffer::unbind();
sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
@@ -6024,16 +6111,16 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield, b
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
U32 res_mod = RenderResolutionDivisor;//.get();
//U32 res_mod = RenderResolutionDivisor;//.get();
LLVector2 tc1(0,0);
LLVector2 tc2((F32) mScreen.getWidth()*2,
(F32) mScreen.getHeight()*2);
if (res_mod > 1)
/*if (res_mod > 1)
{
tc2 /= (F32) res_mod;
}
}*/
LLFastTimer ftm(FTM_RENDER_BLOOM);
gGL.color4f(1,1,1,1);
@@ -6550,7 +6637,13 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield, b
mFXAABuffer.bindTexture(0, channel);
gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
}
gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
F32 scale_x = (F32) width/mFXAABuffer.getWidth();
F32 scale_y = (F32) height/mFXAABuffer.getHeight();
shader->uniform2f(LLShaderMgr::FXAA_TC_SCALE, scale_x, scale_y);
@@ -6570,10 +6663,10 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield, b
}
else
{
if (res_mod > 1)
/*if (res_mod > 1)
{
tc2 /= (F32) res_mod;
}
}*/
U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1;
LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(mask, 0);
@@ -6639,6 +6732,45 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield, b
}
gGL.setSceneBlendType(LLRender::BT_ALPHA);
if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES))
{
if (LLGLSLShader::sNoFixedFunction)
{
gSplatTextureRectProgram.bind();
}
gGL.setColorMask(true, false);
LLVector2 tc1(0,0);
LLVector2 tc2((F32) gViewerWindow->getWorldViewWidthRaw()*2,
(F32) gViewerWindow->getWorldViewHeightRaw()*2);
LLGLEnable blend(GL_BLEND);
gGL.color4f(1,1,1,0.75f);
gGL.getTexUnit(0)->bind(&mPhysicsDisplay);
gGL.begin(LLRender::TRIANGLES);
gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
gGL.vertex2f(-1,-1);
gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
gGL.vertex2f(-1,3);
gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
gGL.vertex2f(3,-1);
gGL.end();
gGL.flush();
if (LLGLSLShader::sNoFixedFunction)
{
gSplatTextureRectProgram.unbind();
}
}
if (LLRenderTarget::sUseFBO)
{ //copy depth buffer from mScreen to framebuffer
LLRenderTarget::copyContentsToFramebuffer(mScreen, 0, 0, mScreen.getWidth(), mScreen.getHeight(),
@@ -9084,7 +9216,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
assertInitialized();
BOOL muted = LLMuteList::getInstance()->isMuted(avatar->getID());
bool muted = avatar->isVisuallyMuted();
pushRenderTypeMask();

View File

@@ -33,14 +33,14 @@
#ifndef LL_PIPELINE_H
#define LL_PIPELINE_H
#include "llcamera.h"
#include "llerror.h"
#include "lldarrayptr.h"
#include "lldqueueptr.h"
#include "llstat.h"
#include "lldrawpool.h"
#include "llspatialpartition.h"
#include "m4math.h"
#include "llmemory.h"
#include "llpointer.h"
#include "lldrawpool.h"
#include "llgl.h"
#include "lldrawable.h"
@@ -48,6 +48,10 @@
#include <stack>
#include <stack>
#include <stack>
class LLViewerTexture;
class LLEdge;
class LLFace;
@@ -110,6 +114,7 @@ public:
void destroyGL();
void restoreGL();
void resetVertexBuffers();
void doResetVertexBuffers();
void resizeScreenTexture();
void releaseGLBuffers();
void releaseScreenBuffers();
@@ -117,7 +122,8 @@ public:
void allocateScreenBuffer(U32 resX, U32 resY);
bool allocateScreenBuffer(U32 resX, U32 resY, U32 samples);
void allocatePhysicsBuffer();
void resetVertexBuffers(LLDrawable* drawable);
void generateImpostor(LLVOAvatar* avatar);
void bindScreenToTexture();
@@ -259,6 +265,7 @@ public:
void renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera& camera, LLCullResult& result, BOOL use_shader = TRUE, BOOL use_occlusion = TRUE);
void renderHighlights();
void renderDebug();
void renderPhysicsDisplay();
void rebuildPools(); // Rebuild pools
@@ -423,30 +430,35 @@ public:
enum LLRenderDebugMask
{
RENDER_DEBUG_COMPOSITION = 0x0000001,
RENDER_DEBUG_VERIFY = 0x0000002,
RENDER_DEBUG_BBOXES = 0x0000004,
RENDER_DEBUG_OCTREE = 0x0000008,
RENDER_DEBUG_WIND_VECTORS = 0x0000010,
RENDER_DEBUG_OCCLUSION = 0x0000020,
RENDER_DEBUG_POINTS = 0x0000040,
RENDER_DEBUG_TEXTURE_PRIORITY = 0x0000080,
RENDER_DEBUG_TEXTURE_AREA = 0x0000100,
RENDER_DEBUG_FACE_AREA = 0x0000200,
RENDER_DEBUG_PARTICLES = 0x0000400,
RENDER_DEBUG_GLOW = 0x0000800,
RENDER_DEBUG_TEXTURE_ANIM = 0x0001000,
RENDER_DEBUG_LIGHTS = 0x0002000,
RENDER_DEBUG_BATCH_SIZE = 0x0004000,
RENDER_DEBUG_ALPHA_BINS = 0x0008000,
RENDER_DEBUG_RAYCAST = 0x0010000,
RENDER_DEBUG_SHAME = 0x0020000,
RENDER_DEBUG_SHADOW_FRUSTA = 0x0040000,
RENDER_DEBUG_SCULPTED = 0x0080000,
RENDER_DEBUG_AVATAR_VOLUME = 0x0100000,
RENDER_DEBUG_BUILD_QUEUE = 0x0200000,
RENDER_DEBUG_AGENT_TARGET = 0x0400000,
RENDER_DEBUG_UPDATE_TYPE = 0x0800000,
RENDER_DEBUG_COMPOSITION = 0x00000001,
RENDER_DEBUG_VERIFY = 0x00000002,
RENDER_DEBUG_BBOXES = 0x00000004,
RENDER_DEBUG_OCTREE = 0x00000008,
RENDER_DEBUG_WIND_VECTORS = 0x00000010,
RENDER_DEBUG_OCCLUSION = 0x00000020,
RENDER_DEBUG_POINTS = 0x00000040,
RENDER_DEBUG_TEXTURE_PRIORITY = 0x00000080,
RENDER_DEBUG_TEXTURE_AREA = 0x00000100,
RENDER_DEBUG_FACE_AREA = 0x00000200,
RENDER_DEBUG_PARTICLES = 0x00000400,
RENDER_DEBUG_GLOW = 0x00000800,
RENDER_DEBUG_TEXTURE_ANIM = 0x00001000,
RENDER_DEBUG_LIGHTS = 0x00002000,
RENDER_DEBUG_BATCH_SIZE = 0x00004000,
RENDER_DEBUG_ALPHA_BINS = 0x00008000,
RENDER_DEBUG_RAYCAST = 0x00010000,
RENDER_DEBUG_SHAME = 0x00020000,
RENDER_DEBUG_SHADOW_FRUSTA = 0x00040000,
RENDER_DEBUG_SCULPTED = 0x00080000,
RENDER_DEBUG_AVATAR_VOLUME = 0x00100000,
RENDER_DEBUG_BUILD_QUEUE = 0x00200000,
RENDER_DEBUG_AGENT_TARGET = 0x00400000,
RENDER_DEBUG_UPDATE_TYPE = 0x00800000,
RENDER_DEBUG_PHYSICS_SHAPES = 0x01000000,
RENDER_DEBUG_NORMALS = 0x02000000,
RENDER_DEBUG_LOD_INFO = 0x04000000,
RENDER_DEBUG_RENDER_COMPLEXITY = 0x08000000,
RENDER_DEBUG_ATTACHMENT_BYTES = 0x10000000,
};
public:
@@ -469,6 +481,10 @@ public:
S32 mNumVisibleNodes;
S32 mVerticesRelit;
S32 mDebugTextureUploadCost;
S32 mDebugSculptUploadCost;
S32 mDebugMeshUploadCost;
S32 mLightingChanges;
S32 mGeometryChanges;
@@ -515,6 +531,7 @@ public:
LLRenderTarget mDeferredDepth;
LLRenderTarget mDeferredLight;
LLMultisampleBuffer mSampleBuffer;
LLRenderTarget mPhysicsDisplay;
//utility buffer for rendering post effects, gets abused by renderDeferredLighting
LLPointer<LLVertexBuffer> mDeferredVB;
@@ -632,6 +649,8 @@ protected:
bool mGroupQ2Locked;
bool mGroupQ1Locked;
bool mResetVertexBuffers; //if true, clear vertex buffers on next update
LLViewerObject::vobj_list_t mCreateQ;
LLDrawable::drawable_set_t mRetexturedList;

View File

@@ -69,38 +69,38 @@
orientation="horizontal" width="430" name="panels">
<layout_panel border="false" bottom="0" default_tab_group="1" height="135" left="0"
min_width="275" name="im_contents_panel" width="305">
<combo_box follows="left|top" height="20" label="Gestures" left="5" name="Gesture"
<combo_box follows="left|top" height="18" label="Gestures" left="5" name="Gesture"
width="120">
<combo_item name="Gestures">
Gestures
</combo_item>
</combo_box>
<check_box bottom_delta="7" enabled="true" follows="left|top" font="SansSerifSmall"
<check_box bottom_delta="0" enabled="true" follows="left|top" font="SansSerifSmall"
height="20" initial_value="false" label="Show Muted Text" left_delta="125"
name="show mutes" radio_style="false" width="116" />
<check_box bottom_delta="-15" enabled="true" follows="left|top" font="SansSerifSmall"
<!--check_box bottom_delta="-15" enabled="true" follows="left|top" font="SansSerifSmall"
height="20" initial_value="false" label="Translate Chat (powered by Google)" left_delta="0"
name="translate chat" radio_style="false" width="100" />
name="translate chat" radio_style="false" width="100" /-->
<button bottom_delta="8" left_delta="250" follows="left|top" font="SansSerifSmall"
<button bottom_delta="0" left_delta="150" follows="left|top" font="SansSerifSmall"
height="20" width="100" label="Open History" name="chat_history_open"
tool_top="Click here to open chat history in external editor." />
<button bottom_delta="7" follows="right|top" height="20" label="&lt; &lt;"
<button bottom_delta="0" follows="right|top" height="20" label="&lt; &lt;"
label_selected="&gt; &gt;" left="272" name="toggle_active_speakers_btn"
right="305"
tool_tip="Click here to show list of active participants in this IM session."
width="70" />
<text_editor type="string" length="1" bg_readonly_color="ChatHistoryBgColor" bg_writeable_color="ChatHistoryBgColor"
<text_editor type="string" length="1" bg_readonly_color="ChatHistoryBgColor" bg_writeable_color="ChatHistoryBgColor"
bottom="28" embedded_items="false" enabled="false"
follows="left|top|right|bottom" font="SansSerif" height="74" left="5"
follows="left|top|right|bottom" font="SansSerif" height="79" left="5"
max_length="2147483647" mouse_opaque="true" name="Chat History Editor"
track_bottom="true"
track_bottom="true"
text_color="ChatHistoryTextColor"
text_readonly_color="ChatHistoryTextColor" width="299" word_wrap="true" spell_check="true" />
<text_editor type="string" length="1" bg_readonly_color="ChatHistoryBgColor" bg_writeable_color="ChatHistoryBgColor"
bottom="28" embedded_items="false" enabled="false"
follows="left|top|right|bottom" font="SansSerif" height="74" left="5"
follows="left|top|right|bottom" font="SansSerif" height="79" left="5"
max_length="2147483647" mouse_opaque="true"
name="Chat History Editor with mute" text_color="ChatHistoryTextColor"
track_bottom="true"

View File

@@ -26,7 +26,7 @@
<spinner bottom_delta="-24" control_name="RenderFogRatio" decimal_digits="1" height="16" increment="0.1" initial_val="4" label="Fog Distance Ratio:" label_width="138" left="10" max_val="10" min_val="0.5" name="fog" width="202"/>
<text bottom_delta="-50" height="40" left="10" name="note">
Note: the Gamma and Fog Distance Ratio settings are unavailable
(since useless) when the Atmospheric Shaders are enabled.
(since useless) when the Atmospheric Shaders are enabled.
</text>
<button bottom="10" height="20" label="OK" label_selected="OK" left="-110" name="OK" scale_image="true" width="90"/>
</floater>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater border="true" bottom="-298" can_close="true" can_drag_on_left="false"
can_minimize="true" can_resize="true" default_tab_group="1"
follows="left|top|right|bottom" height="297" label="(unknown)" left="1"
follows="left|top|right|bottom" height="296" label="(unknown)" left="1"
min_height="155" min_width="345" mouse_opaque="true" name="im_floater"
rect_control="" title="(unknown)" width="501">
<string name="ringing">
@@ -64,18 +64,18 @@
</panel>
<text_editor type="string" length="1" bg_readonly_color="ChatHistoryBgColor" bg_writeable_color="ChatHistoryBgColor"
bottom="30" embedded_items="false" enabled="false"
follows="left|top|right|bottom" font="SansSerif" height="221" left="5"
follows="left|top|right|bottom" font="SansSerif" height="221" left="7"
max_length="2147483647" mouse_opaque="true" name="im_history"
text_color="ChatHistoryTextColor"
track_bottom="true"
text_readonly_color="ChatHistoryTextColor" width="487" word_wrap="true" />
<line_editor bevel_style="in" border_style="line" border_thickness="1" bottom="7"
follows="left|right|bottom" font="SansSerif" height="20"
label="Click here to instant message" left="5" max_length="2147483647"
label="Click here to instant message" left="7" max_length="2147483647"
mouse_opaque="true" name="chat_editor" select_all_on_focus_received="false"
select_on_focus="false" tab_group="1" width="423" spell_check="true" />
<button bottom="7" follows="right|bottom" font="SansSerif" halign="center" height="20"
label="Send" left="433" mouse_opaque="true" name="send_btn"
label="Send" left="435" mouse_opaque="true" name="send_btn"
scale_image="true" width="60" />
<string name="live_help_dialog">
*** Welcome to Help Request ***

View File

@@ -46,7 +46,7 @@
visible="true" width="80" />
<text_editor type="string" length="1" bg_readonly_color="ChatHistoryBgColor" bg_writeable_color="ChatHistoryBgColor"
bottom="-265" embedded_items="false" enabled="false"
follows="left|top|right|bottom" font="SansSerif" height="239" left="5"
follows="left|top|right|bottom" font="SansSerif" height="239" left="7"
max_length="2147483647" mouse_opaque="true" name="im_history"
track_bottom="true"
text_color="ChatHistoryTextColor"
@@ -54,11 +54,11 @@
<line_editor bevel_style="in" border_style="line" border_thickness="1" bottom="7"
enabled="true" follows="left|right|bottom" font="SansSerif"
handle_edit_keys_directly="false" height="20"
label="Click here to instant message" left="5" max_length="1022"
label="Click here to instant message" left="7" max_length="1022"
mouse_opaque="true" name="chat_editor" select_all_on_focus_received="false"
select_on_focus="false" tab_group="1" width="426" spell_check="true" />
<button bottom_delta="0" enabled="true" follows="right|bottom" font="SansSerif"
halign="center" height="20" label="Send" left="436" mouse_opaque="true"
halign="center" height="20" label="Send" left="438" mouse_opaque="true"
name="send_btn" scale_image="true" width="60" />
</layout_panel>
<layout_panel auto_resize="false" bottom="0" can_resize="true"

View File

@@ -41,7 +41,7 @@
Your text chat has been disabled by a Group Moderator.
</string>
<layout_stack border="false" bottom="0" follows="left|top|right|bottom" height="276" left="0"
orientation="horizontal" tab_group="1" width="495" name="panels">
orientation="horizontal" tab_group="1" width="496" name="panels">
<layout_panel border="false" bottom="0" default_tab_group="1" follows="left|top|bottom|right"
height="130" left="0" min_width="210" name="im_contents_panel" width="175">
<button bottom="-20" follows="left|top" height="20" label="Group Info" left="5"
@@ -55,25 +55,24 @@
label="End Call" left_delta="0" name="end_call_btn" pad_right="12"
visible="false" width="80" />
<button bottom_delta="0" follows="right|top" height="20" label="&lt; &lt;"
label_selected="&gt; &gt;" left="143" name="toggle_active_speakers_btn"
right="176"
label_selected="&gt; &gt;" left="145" name="toggle_active_speakers_btn"
tool_tip="Click here to toggle a list of active participants in this IM session."
visible="true" width="30" />
visible="true" width="33" />
<text_editor type="string" length="1" bg_readonly_color="ChatHistoryBgColor" bg_writeable_color="ChatHistoryBgColor"
bottom="30" embedded_items="false" enabled="false"
follows="left|top|right|bottom" font="SansSerif" left="4"
follows="left|top|right|bottom" font="SansSerif" left="7"
max_length="2147483647" mouse_opaque="true" name="im_history"
text_color="ChatHistoryTextColor"
track_bottom="true"
text_readonly_color="ChatHistoryTextColor" top="104" width="170"
track_bottom="true"
text_readonly_color="ChatHistoryTextColor" top="104" width="170"
word_wrap="true" />
<line_editor bevel_style="in" border_style="line" border_thickness="1" bottom="7"
enabled="true" follows="left|right|bottom" font="SansSerif" height="20"
left="5" max_length="1022" mouse_opaque="true" name="chat_editor"
left="7" max_length="1022" mouse_opaque="true" name="chat_editor"
select_all_on_focus_received="false" select_on_focus="false" tab_group="1"
width="106" spell_check="true" />
<button bottom="7" enabled="true" follows="right|bottom" font="SansSerif"
halign="center" height="20" label="Send" left="116" mouse_opaque="true"
halign="center" height="20" label="Send" left="118" mouse_opaque="true"
name="send_btn" scale_image="true" width="60" />
</layout_panel>
<layout_panel auto_resize="false" bottom="0" can_resize="true"

View File

@@ -1,128 +1,99 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater bottom="0" can_minimize="true" can_resize="false" height="500" left="0"
name="Joystick" title="Joystick Configuration" width="550">
<check_box name="enable_joystick" bottom="-38" left="14" width="60" halign="left" border_drop_shadow_visible="true" control_name="JoystickEnabled">Enable Joystick:</check_box>
<text name="joystick_type" bottom="-32" left="120" width="380" halign="left"></text>
<spinner bottom="-48" left="20" width="140" label_width="100" control_name="JoystickAxis1" name="JoystickAxis1" label="X Axis Mapping" decimal_digits="0" increment="1" min_val="-1" max_val="5"/>
<spinner bottom="-48" left="190" width="140" label_width="100" control_name="JoystickAxis2" name="JoystickAxis2" label="Y Axis Mapping" decimal_digits="0" increment="1" min_val="-1" max_val="5"/>
<spinner bottom="-48" left="360" width="140" label_width="100" control_name="JoystickAxis0" name="JoystickAxis0" label="Z Axis Mapping" decimal_digits="0" increment="1" min_val="-1" max_val="5"/>
<spinner bottom="-68" left="20" width="140" label_width="100" control_name="JoystickAxis4" name="JoystickAxis4" label="Pitch Mapping" decimal_digits="0" increment="1" min_val="-1" max_val="5"/>
<spinner bottom="-68" left="190" width="140" label_width="100" control_name="JoystickAxis5" name="JoystickAxis5" label="Yaw Mapping" decimal_digits="0" increment="1" min_val="-1" max_val="5"/>
<spinner bottom="-68" left="360" width="140" label_width="100" control_name="JoystickAxis3" name="JoystickAxis3" label="Roll Mapping" decimal_digits="0" increment="1" min_val="-1" max_val="5"/>
<spinner bottom="-88" left="20" width="140" label_width="100" control_name="JoystickAxis6" name="JoystickAxis6" label="Zoom Mapping" decimal_digits="0" increment="1" min_val="-1" max_val="5"/>
<check_box bottom="-96" left="185" control_name="ZoomDirect" label="Direct Zoom" name="ZoomDirect" />
<check_box bottom="-96" left="310" control_name="Cursor3D" label="3D Cursor" name="Cursor3D" />
<check_box bottom="-96" left="420" control_name="AutoLeveling" label="Auto Level" name="AutoLeveling" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-120" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="right" height="10" hidden="false"
left="12" mouse_opaque="false" v_pad="0" width="102" name="Control Modes:">
Control Modes:
</text>
<check_box bottom="-127" left="125" width="60" halign="center" border_drop_shadow_visible="true" control_name="JoystickAvatarEnabled" name="JoystickAvatarEnabled">Avatar</check_box>
<check_box bottom="-127" left="194" width="60" halign="center" border_drop_shadow_visible="true" control_name="JoystickBuildEnabled" name="JoystickBuildEnabled">Build</check_box>
<check_box bottom="-127" left="262" width="60" halign="center" border_drop_shadow_visible="true" control_name="JoystickFlycamEnabled" name="JoystickFlycamEnabled">Flycam</check_box>
<text bottom="-144" left="20" width="94" halign="right" name="XScale">X Scale</text>
<spinner bottom="-144" left="125" width="56" label_width="0" control_name="AvatarAxisScale1" name="AvatarAxisScale1" decimal_digits="2" increment="0.1" min_val="-50" max_val="50"/>
<spinner bottom="-144" left="195" width="56" label_width="0" control_name="BuildAxisScale1" name="BuildAxisScale1" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<spinner bottom="-144" left="265" width="56" label_width="0" control_name="FlycamAxisScale1" name="FlycamAxisScale1" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<text bottom="-164" left="20" width="94" halign="right" name="YScale">Y Scale</text>
<spinner bottom="-164" left="125" width="56" label_width="0" control_name="AvatarAxisScale2" name="AvatarAxisScale2" decimal_digits="2" increment="0.1" min_val="-50" max_val="50"/>
<spinner bottom="-164" left="195" width="56" label_width="0" control_name="BuildAxisScale2" name="BuildAxisScale2" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<spinner bottom="-164" left="265" width="56" label_width="0" control_name="FlycamAxisScale2" name="FlycamAxisScale2" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<text bottom="-184" left="20" width="94" halign="right" name="ZScale">Z Scale</text>
<spinner bottom="-184" left="125" width="56" label_width="0" control_name="AvatarAxisScale0" name="AvatarAxisScale0" decimal_digits="2" increment="0.1" min_val="-50" max_val="50"/>
<spinner bottom="-184" left="195" width="56" label_width="0" control_name="BuildAxisScale0" name="BuildAxisScale0" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<spinner bottom="-184" left="265" width="56" label_width="0" control_name="FlycamAxisScale0" name="FlycamAxisScale0" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<text bottom="-204" left="20" width="94" halign="right" name="PitchScale">Pitch Scale</text>
<spinner bottom="-204" left="125" width="56" label_width="0" control_name="AvatarAxisScale4" name="AvatarAxisScale4" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<spinner bottom="-204" left="195" width="56" label_width="0" control_name="BuildAxisScale4" name="BuildAxisScale4" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<spinner bottom="-204" left="265" width="56" label_width="0" control_name="FlycamAxisScale4" name="FlycamAxisScale4" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<text bottom="-224" left="20" width="94" halign="right" name="YawScale">Yaw Scale</text>
<spinner bottom="-224" left="125" width="56" label_width="0" control_name="AvatarAxisScale5" name="AvatarAxisScale5" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<spinner bottom="-224" left="195" width="56" label_width="0" control_name="BuildAxisScale5" name="BuildAxisScale5" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<spinner bottom="-224" left="265" width="56" label_width="0" control_name="FlycamAxisScale5" name="FlycamAxisScale5" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<text bottom="-244" left="20" width="94" halign="right" name="RollScale">Roll Scale</text>
<spinner bottom="-244" left="195" width="56" label_width="0" control_name="BuildAxisScale3" name="BuildAxisScale3" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<spinner bottom="-244" left="265" width="56" label_width="0" control_name="FlycamAxisScale3" name="FlycamAxisScale3" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<text bottom="-274" left="20" width="94" halign="right" name="XDeadZone">X Dead Zone</text>
<spinner bottom="-274" left="125" width="56" label_width="0" control_name="AvatarAxisDeadZone1" name="AvatarAxisDeadZone1" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-274" left="195" width="56" label_width="0" control_name="BuildAxisDeadZone1" name="BuildAxisDeadZone1" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-274" left="265" width="56" label_width="0" control_name="FlycamAxisDeadZone1" name="FlycamAxisDeadZone1" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<text bottom="-294" left="20" width="94" halign="right" name="YDeadZone">Y Dead Zone</text>
<spinner bottom="-294" left="125" width="56" label_width="0" control_name="AvatarAxisDeadZone2" name="AvatarAxisDeadZone2" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-294" left="195" width="56" label_width="0" control_name="BuildAxisDeadZone2" name="BuildAxisDeadZone2" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-294" left="265" width="56" label_width="0" control_name="FlycamAxisDeadZone2" name="FlycamAxisDeadZone2" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<text bottom="-314" left="20" width="94" halign="right" name="ZDeadZone">Z Dead Zone</text>
<spinner bottom="-314" left="125" width="56" label_width="0" control_name="AvatarAxisDeadZone0" name="AvatarAxisDeadZone0" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-314" left="195" width="56" label_width="0" control_name="BuildAxisDeadZone0" name="BuildAxisDeadZone0" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-314" left="265" width="56" label_width="0" control_name="FlycamAxisDeadZone0" name="FlycamAxisDeadZone0" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<text bottom="-334" left="20" width="94" halign="right" name="PitchDeadZone">Pitch Dead Zone</text>
<spinner bottom="-334" left="125" width="56" label_width="0" control_name="AvatarAxisDeadZone4" name="AvatarAxisDeadZone4" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-334" left="195" width="56" label_width="0" control_name="BuildAxisDeadZone4" name="BuildAxisDeadZone4" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-334" left="265" width="56" label_width="0" control_name="FlycamAxisDeadZone4" name="FlycamAxisDeadZone4" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<text bottom="-354" left="20" width="94" halign="right" name="YawDeadZone">Yaw Dead Zone</text>
<spinner bottom="-354" left="125" width="56" label_width="0" control_name="AvatarAxisDeadZone5" name="AvatarAxisDeadZone5" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-354" left="195" width="56" label_width="0" control_name="BuildAxisDeadZone5" name="BuildAxisDeadZone5" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-354" left="265" width="56" label_width="0" control_name="FlycamAxisDeadZone5" name="FlycamAxisDeadZone5" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<text bottom="-374" left="20" width="94" halign="right" name="RollDeadZone">Roll Dead Zone</text>
<spinner bottom="-374" left="195" width="56" label_width="0" control_name="BuildAxisDeadZone3" name="BuildAxisDeadZone3" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-374" left="265" width="56" label_width="0" control_name="FlycamAxisDeadZone3" name="FlycamAxisDeadZone3" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<text bottom="-402" left="20" width="94" halign="right" name="Feathering">Feathering</text>
<slider bottom="-408" left="116" can_edit_text="false" control_name="AvatarFeathering"
decimal_digits="0" follows="left|top" height="16" increment="1"
initial_val="0.7" label="" max_val="32" min_val="1"
mouse_opaque="true" name="AvatarFeathering" show_text="false" value="0.7"
width="73" />
<slider bottom="-408" left="186" can_edit_text="false" control_name="BuildFeathering"
decimal_digits="0" follows="left|top" height="16" increment="1"
initial_val="0.7" label="" max_val="32" min_val="1"
mouse_opaque="true" name="BuildFeathering" show_text="false" value="0.7"
width="73" />
<slider bottom="-408" left="256" can_edit_text="false" control_name="FlycamFeathering"
decimal_digits="0" follows="left|top" height="16" increment="1"
initial_val="0.7" label="" max_val="32" min_val="1"
mouse_opaque="true" name="FlycamFeathering" show_text="false" value="0.7"
width="73" />
<text bottom="-430" left="20" width="94" halign="right" name="ZoomScale2">Zoom Scale</text>
<spinner bottom="-430" left="265" width="56" label_width="0" control_name="FlycamAxisScale6" name="FlycamAxisScale6" label="" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<text bottom="-450" left="20" width="94" halign="right" name="ZoomDeadZone">Zoom Dead Zone</text>
<spinner bottom="-450" left="265" width="56" label_width="0" control_name="FlycamAxisDeadZone6" name="FlycamAxisDeadZone6" label="" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<button bottom="-451" left="340" enabled="true" follows="left|top" font="SansSerif"
halign="center" height="22" hidden="false"
label="SpaceNavigator Defaults" mouse_opaque="true"
name="SpaceNavigatorDefaults" scale_image="true" width="184" />
<button bottom="-480" follows="right|bottom" font="SansSerif" halign="center"
height="20" label="OK" label_selected="OK" left="340"
mouse_opaque="true" name="ok_btn" width="90" />
<button bottom="-480" follows="right|bottom" font="SansSerif" halign="center"
height="20" label="Cancel" label_selected="Cancel" left_delta="94"
mouse_opaque="true" name="cancel_btn" width="90" />
<floater height="500" name="Joystick" title="Joystick Configuration" width="550">
<check_box name="enable_joystick" bottom="-38" left="14" control_name="JoystickEnabled">Enable Joystick:</check_box>
<text name="joystick_type" bottom="-32" left="120" halign="left"></text>
<string name="JoystickMonitor">Joystick Monitor</string>
<string name="Axis">Axis [NUM]</string>
<string name="NoDevice">no device detected</string>
<spinner bottom="-48" left="20" width="140" label_width="100" control_name="JoystickAxis1" name="JoystickAxis1" label="X Axis Mapping" decimal_digits="0" increment="1" min_val="-1" max_val="5"/>
<spinner bottom="-68" width="140" label_width="100" control_name="JoystickAxis4" name="JoystickAxis4" label="Pitch Mapping" decimal_digits="0" increment="1" min_val="-1" max_val="5"/>
<spinner bottom="-88" width="140" label_width="100" control_name="JoystickAxis6" name="JoystickAxis6" label="Zoom Mapping" decimal_digits="0" increment="1" min_val="-1" max_val="5"/>
<spinner bottom="-48" left="190" width="140" label_width="100" control_name="JoystickAxis2" name="JoystickAxis2" label="Y Axis Mapping" decimal_digits="0" increment="1" min_val="-1" max_val="5"/>
<spinner bottom="-68" width="140" label_width="100" control_name="JoystickAxis5" name="JoystickAxis5" label="Yaw Mapping" decimal_digits="0" increment="1" min_val="-1" max_val="5"/>
<spinner bottom="-48" left="360" width="140" label_width="100" control_name="JoystickAxis0" name="JoystickAxis0" label="Z Axis Mapping" decimal_digits="0" increment="1" min_val="-1" max_val="5"/>
<spinner bottom="-68" width="140" label_width="100" control_name="JoystickAxis3" name="JoystickAxis3" label="Roll Mapping" decimal_digits="0" increment="1" min_val="-1" max_val="5"/>
<check_box bottom="-96" left="185" control_name="ZoomDirect" label="Direct Zoom" name="ZoomDirect"/>
<check_box bottom="-96" left="310" control_name="Cursor3D" label="3D Cursor" name="Cursor3D"/>
<check_box bottom="-96" left="420" control_name="AutoLeveling" label="Auto Level" name="AutoLeveling"/>
<text bottom="-120" follows="top" height="10" left="12" name="Control Modes:">Control Modes:</text>
<check_box bottom="-127" left="125" control_name="JoystickAvatarEnabled" name="JoystickAvatarEnabled">Avatar</check_box>
<check_box bottom="-127" left="194" control_name="JoystickBuildEnabled" name="JoystickBuildEnabled">Build</check_box>
<check_box bottom="-127" left="262" control_name="JoystickFlycamEnabled" name="JoystickFlycamEnabled">Flycam</check_box>
<text bottom="-144" left="20" width="94" halign="right" name="XScale">X Scale</text>
<spinner bottom="-144" left="125" width="56" control_name="AvatarAxisScale1" name="AvatarAxisScale1" decimal_digits="2" increment="0.1" min_val="-50" max_val="50"/>
<spinner bottom="-144" left="195" width="56" control_name="BuildAxisScale1" name="BuildAxisScale1" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<spinner bottom="-144" left="265" width="56" control_name="FlycamAxisScale1" name="FlycamAxisScale1" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<text bottom="-164" left="20" width="94" halign="right" name="YScale">Y Scale</text>
<spinner bottom="-164" left="125" width="56" control_name="AvatarAxisScale2" name="AvatarAxisScale2" decimal_digits="2" increment="0.1" min_val="-50" max_val="50"/>
<spinner bottom="-164" left="195" width="56" control_name="BuildAxisScale2" name="BuildAxisScale2" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<spinner bottom="-164" left="265" width="56" control_name="FlycamAxisScale2" name="FlycamAxisScale2" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<text bottom="-184" left="20" width="94" halign="right" name="ZScale">Z Scale</text>
<spinner bottom="-184" left="125" width="56" control_name="AvatarAxisScale0" name="AvatarAxisScale0" decimal_digits="2" increment="0.1" min_val="-50" max_val="50"/>
<spinner bottom="-184" left="195" width="56" control_name="BuildAxisScale0" name="BuildAxisScale0" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<spinner bottom="-184" left="265" width="56" control_name="FlycamAxisScale0" name="FlycamAxisScale0" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<text bottom="-204" left="20" width="94" halign="right" name="PitchScale">Pitch Scale</text>
<spinner bottom="-204" left="125" width="56" control_name="AvatarAxisScale4" name="AvatarAxisScale4" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<spinner bottom="-204" left="195" width="56" control_name="BuildAxisScale4" name="BuildAxisScale4" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<spinner bottom="-204" left="265" width="56" control_name="FlycamAxisScale4" name="FlycamAxisScale4" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<text bottom="-224" left="20" width="94" halign="right" name="YawScale">Yaw Scale</text>
<spinner bottom="-224" left="125" width="56" control_name="AvatarAxisScale5" name="AvatarAxisScale5" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<spinner bottom="-224" left="195" width="56" control_name="BuildAxisScale5" name="BuildAxisScale5" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<spinner bottom="-224" left="265" width="56" control_name="FlycamAxisScale5" name="FlycamAxisScale5" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<text bottom="-244" left="20" width="94" halign="right" name="RollScale">Roll Scale</text>
<spinner bottom="-244" left="195" width="56" control_name="BuildAxisScale3" name="BuildAxisScale3" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<spinner bottom="-244" left="265" width="56" control_name="FlycamAxisScale3" name="FlycamAxisScale3" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<text bottom="-274" left="20" width="94" halign="right" name="XDeadZone">X Dead Zone</text>
<spinner bottom="-274" left="125" width="56" control_name="AvatarAxisDeadZone1" name="AvatarAxisDeadZone1" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-274" left="195" width="56" control_name="BuildAxisDeadZone1" name="BuildAxisDeadZone1" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-274" left="265" width="56" control_name="FlycamAxisDeadZone1" name="FlycamAxisDeadZone1" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<text bottom="-294" left="20" width="94" halign="right" name="YDeadZone">Y Dead Zone</text>
<spinner bottom="-294" left="125" width="56" control_name="AvatarAxisDeadZone2" name="AvatarAxisDeadZone2" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-294" left="195" width="56" control_name="BuildAxisDeadZone2" name="BuildAxisDeadZone2" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-294" left="265" width="56" control_name="FlycamAxisDeadZone2" name="FlycamAxisDeadZone2" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<text bottom="-314" left="20" width="94" halign="right" name="ZDeadZone">Z Dead Zone</text>
<spinner bottom="-314" left="125" width="56" control_name="AvatarAxisDeadZone0" name="AvatarAxisDeadZone0" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-314" left="195" width="56" control_name="BuildAxisDeadZone0" name="BuildAxisDeadZone0" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-314" left="265" width="56" control_name="FlycamAxisDeadZone0" name="FlycamAxisDeadZone0" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<text bottom="-334" left="20" width="94" halign="right" name="PitchDeadZone">Pitch Dead Zone</text>
<spinner bottom="-334" left="125" width="56" control_name="AvatarAxisDeadZone4" name="AvatarAxisDeadZone4" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-334" left="195" width="56" control_name="BuildAxisDeadZone4" name="BuildAxisDeadZone4" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-334" left="265" width="56" control_name="FlycamAxisDeadZone4" name="FlycamAxisDeadZone4" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<text bottom="-354" left="20" width="94" halign="right" name="YawDeadZone">Yaw Dead Zone</text>
<spinner bottom="-354" left="125" width="56" control_name="AvatarAxisDeadZone5" name="AvatarAxisDeadZone5" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-354" left="195" width="56" control_name="BuildAxisDeadZone5" name="BuildAxisDeadZone5" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-354" left="265" width="56" control_name="FlycamAxisDeadZone5" name="FlycamAxisDeadZone5" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<text bottom="-374" left="20" width="94" halign="right" name="RollDeadZone">Roll Dead Zone</text>
<spinner bottom="-374" left="195" width="56" control_name="BuildAxisDeadZone3" name="BuildAxisDeadZone3" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<spinner bottom="-374" left="265" width="56" control_name="FlycamAxisDeadZone3" name="FlycamAxisDeadZone3" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<text bottom="-402" left="20" width="94" halign="right" name="Feathering">Feathering</text>
<spinner bottom="-402" left="125" width="56" control_name="AvatarFeathering" name="AvatarFeathering" decimal_digits="0" increment="1" initial_val="0.7" max_val="32" min_val="1"/>
<spinner bottom="-402" left="195" width="56" control_name="BuildFeathering" name="BuildFeathering" decimal_digits="0" increment="1" initial_val="0.7" max_val="32" min_val="1" value="0.7"/>
<spinner bottom="-402" left="265" width="56" control_name="FlycamFeathering" name="FlycamFeathering" decimal_digits="0" increment="1" initial_val="0.7" max_val="32" min_val="1" value="0.7"/>
<text bottom="-430" left="20" width="94" halign="right" name="ZoomScale2">Zoom Scale</text>
<spinner bottom="-430" left="265" width="56" label_width="0" control_name="FlycamAxisScale6" name="FlycamAxisScale6" decimal_digits="2" increment="0.1" min_val="-1024" max_val="1024"/>
<text bottom="-450" left="20" width="94" halign="right" name="ZoomDeadZone">Zoom Dead Zone</text>
<spinner bottom="-450" left="265" width="56" label_width="0" control_name="FlycamAxisDeadZone6" name="FlycamAxisDeadZone6" decimal_digits="2" increment="0.01" min_val="0" max_val="1"/>
<button bottom="-451" left="340" height="22" label="SpaceNavigator Defaults" name="SpaceNavigatorDefaults" scale_image="true" width="184"/>
<button bottom="-480" left="340" height="20" label="OK" label_selected="OK" name="ok_btn" width="90"/>
<button bottom="-480" left_delta="94" height="20" label="Cancel" label_selected="Cancel" name="cancel_btn" width="90"/>
</floater>

View File

@@ -8,7 +8,10 @@
word_wrap="true" show_line_numbers="true">
Loading...
</text_editor>
<button bottom="-499" enabled="true" follows="right|bottom" font="SansSerif"
<button bottom="-499" enabled="true" follows="right|bottom" font="SansSerif"
halign="center" height="20" label="Edit..." label_selected="Edit..." left="230"
mouse_opaque="true" name="Edit_btn" width="128" />
<button bottom="-499" enabled="true" follows="right|bottom" font="SansSerif"
halign="center" height="20" label="Save" label_selected="Save" left="360"
mouse_opaque="true" name="Save_btn" width="128" />
<scroll_list background_visible="true" bottom="-457" column_padding="5" draw_border="true"

View File

@@ -1412,42 +1412,25 @@
mouse_opaque="true" name="tex offset" v_pad="0" width="160">
Offset
</text>
<spinner bottom="-308" decimal_digits="4" follows="left|top" height="16" increment="0.05"
initial_val="0" label="Horizontal (U)" label_width="90" left="20"
max_val="1" min_val="-1" mouse_opaque="true" name="TexOffsetU" width="160" />
<spinner bottom_delta="-18" decimal_digits="4" follows="left|top" height="16"
increment="0.05" initial_val="0" label="Vertical (V)" label_width="90"
left="20" max_val="1" min_val="-1" mouse_opaque="true" name="TexOffsetV"
width="160" />
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-352" drop_shadow_visible="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="20" left="10"
mouse_opaque="true" name="textbox autofix" v_pad="0" width="160">
Align media texture
(must load first)
</text>
<spinner bottom="-308" decimal_digits="4" follows="top" height="16" increment="0.01" initial_val="0" label="Horizontal (U)" label_width="90" left="20"
max_val="1" min_val="-1" mouse_opaque="true" name="TexOffsetU" width="160"/>
<spinner bottom_delta="-18" decimal_digits="4" follows="top" height="16" increment="0.01" initial_val="0" label="Vertical (V)" label_width="90"
left="20" max_val="1" min_val="-1" name="TexOffsetV"
width="160"/>
<text bottom="-352" height="20" left="10" name="textbox autofix" v_pad="0" width="160">Align media texture
(must load first)</text>
<button bottom="-360" follows="left|top" font="SansSerifSmall" halign="center"
height="20" label="Align" label_selected="Align" left="112"
mouse_opaque="true" name="button align" scale_image="TRUE" width="68" />
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-322" drop_shadow_visible="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="20" left="185"
mouse_opaque="true" name="textbox params" v_pad="0" width="160">
Texture Params
</text>
<text bottom="-322" drop_shadow_visible="true" follows="left|top" height="20" left="185" name="textbox params">Texture Params</text>
<button bottom_delta="-18" follows="top|right" font="SansSerifSmall" halign="center"
height="20" label="Copy" left_delta="5" mouse_opaque="true" name="copytextures" enabled="true"
tool_tip="Copy Testure Params from Clipboard" width="68" />
<button bottom_delta="-20" follows="top|right" font="SansSerifSmall" halign="center"
height="20" label="Paste" left_delta="0" mouse_opaque="true" name="pastetextures" enabled="true"
tool_tip="Paste Texture Params from Clipboard" width="68" />
<button bottom_delta="-20" follows="top" height="20" label="Paste" name="pastetextures" tool_tip="Paste Texture Params from Clipboard" width="68" />
</panel>
<panel border="true" bottom="-383" follows="left|top|right|bottom" height="367"
label="Content" left="1" mouse_opaque="false" name="Contents" width="270">
<button bottom="-30" follows="left|top" font="SansSerif" halign="center" height="20"
label="New Script" label_selected="New Script"
left="10" mouse_opaque="true" name="button new script" scale_image="TRUE"
width="100" />
<button bottom="-30" follows="left|top" font="SansSerif" halign="center" height="20" label="New Script" label_selected="New Script" left="10" name="button new script" scale_image="TRUE" width="100"/>
<button bottom_delta="0" left_delta="110" width="100" height="20" follows="left|top"
label="Permissions..." name="button permissions" font="SansSerif" halign="center"
mouse_opaque="true" scale_image="TRUE" />

View File

@@ -1,60 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel border="false" follows="left|top|right|bottom" height="160"
label="Audio &amp; Video" name="Media panel" width="175">
<slider bottom_delta="-20" control_name="AudioLevelMaster" follows="left|top|right"
height="15" increment="0.05" initial_val="0.5" label="Master"
label_width="55" left="10" max_val="1" min_val="0" mouse_opaque="true"
name="System Volume" show_text="false" volume="true" width="180" />
<button bottom_delta="0" control_name="MuteAudio" follows="top|right" height="16"
image_selected="icn_speaker-muted_dark.tga"
image_unselected="icn_speaker_dark.tga" label="" label_width="55"
left="150" name="mute_audio" tab_stop="false" toggle="true" width="25" />
<slider bottom_delta="-30" control_name="AudioLevelMusic" follows="left|top|right"
height="15" increment="0.05" initial_val="0.5" label="Music"
label_width="55" left="10" max_val="1" min_val="0" name="Music Volume"
show_text="false" volume="true" width="180" />
<button bottom_delta="0" control_name="MuteMusic" follows="top|right" height="16"
image_selected="icn_speaker-muted_dark.tga"
image_unselected="icn_speaker_dark.tga" label="" label_width="55"
left="150" name="mute_music" tab_stop="false" toggle="true" width="25" />
<slider bottom_delta="-20" control_name="AudioLevelMedia" follows="left|top|right"
height="15" increment="0.05" initial_val="0.5" label="Media"
label_width="55" left="10" max_val="1" min_val="0" name="Media Volume"
show_text="false" volume="true" width="180" />
<button bottom_delta="0" control_name="MuteMedia" follows="top|right" height="16"
image_selected="icn_speaker-muted_dark.tga"
image_unselected="icn_speaker_dark.tga" label="" label_width="55"
left="150" name="mute_media" tab_stop="false" toggle="true" width="25" />
<slider bottom_delta="-20" control_name="AudioLevelVoice" follows="left|top|right"
height="15" increment="0.05" initial_val="0.5" label="Voice"
label_width="55" left="10" max_val="1" min_val="0" name="Voice Volume"
show_text="false" volume="true" width="180" />
<button bottom_delta="0" control_name="MuteVoice" follows="top|right" height="16"
image_selected="icn_speaker-muted_dark.tga"
image_unselected="icn_speaker_dark.tga" label="" label_width="55"
left="150" name="mute_voice" tab_stop="false" toggle="true" width="25" />
<slider bottom_delta="-20" control_name="AudioLevelSFX" follows="left|top|right"
height="15" increment="0.05" initial_val="0.5" label="Sounds"
label_width="55" left="10" max_val="1" min_val="0" name="SFX Volume"
show_text="false" volume="true" width="180" />
<button bottom_delta="0" control_name="MuteSounds" follows="top|right" height="16"
image_selected="icn_speaker-muted_dark.tga"
image_unselected="icn_speaker_dark.tga" label="" label_width="55"
left="150" name="mute_sfx" tab_stop="false" toggle="true" width="25" />
<slider bottom_delta="-20" control_name="AudioLevelAmbient" follows="left|top|right"
height="15" increment="0.05" initial_val="0.5" label="Ambient"
label_width="55" left="10" max_val="1" min_val="0" name="Wind Volume"
show_text="false" volume="true" width="180" />
<button bottom_delta="0" control_name="MuteAmbient" follows="top|right" height="16"
image_selected="icn_speaker-muted_dark.tga"
image_unselected="icn_speaker_dark.tga" label="" label_width="55"
left="150" name="mute_wind" tab_stop="false" toggle="true" width="25" />
<slider bottom_delta="-20" control_name="AudioLevelUI" follows="left|top|right"
height="15" increment="0.05" initial_val="0.5" label="UI" label_width="55"
left="10" max_val="1" min_val="0" name="UI Volume" show_text="false"
volume="true" width="180" />
<button bottom_delta="0" control_name="MuteUI" follows="top|right" height="16"
image_selected="icn_speaker-muted_dark.tga"
image_unselected="icn_speaker_dark.tga" label="" label_width="55"
left="150" name="mute_ui" tab_stop="false" toggle="true" width="25" />
<panel border="false" height="160" label="Audio &amp; Video" name="Media panel" width="175">
<slider bottom_delta="-20" control_name="AudioLevelMaster" follows="top" height="15" increment="0.05" initial_val="0.5" label="Master" label_width="55" left="10" max_val="1" min_val="0" name="System Volume" can_edit_text="true" volume="true" width="218"/>
<button bottom_delta="0" control_name="MuteAudio" follows="top|right" height="16" image_selected="icn_speaker-muted_dark.tga" image_unselected="icn_speaker_dark.tga" label="" label_width="55" left="150" name="mute_audio" toggle="true" width="25"/>
<slider bottom_delta="-30" control_name="AudioLevelMusic" follows="top" height="15" increment="0.05" initial_val="0.5" label="Music" label_width="55" left="10" max_val="1" min_val="0" name="Music Volume" can_edit_text="true" volume="true" width="218"/>
<button bottom_delta="0" control_name="MuteMusic" follows="top|right" height="16" image_selected="icn_speaker-muted_dark.tga" image_unselected="icn_speaker_dark.tga" label="" label_width="55" left="150" name="mute_music" toggle="true" width="25"/>
<slider bottom_delta="-20" control_name="AudioLevelMedia" follows="top" height="15" increment="0.05" initial_val="0.5" label="Media" label_width="55" left="10" max_val="1" min_val="0" name="Media Volume" can_edit_text="true" volume="true" width="218"/>
<button bottom_delta="0" control_name="MuteMedia" follows="top|right" height="16" image_selected="icn_speaker-muted_dark.tga" image_unselected="icn_speaker_dark.tga" label="" label_width="55" left="150" name="mute_media" toggle="true" width="25"/>
<slider bottom_delta="-20" control_name="AudioLevelVoice" follows="top" height="15" increment="0.05" initial_val="0.5" label="Voice" label_width="55" left="10" max_val="1" min_val="0" name="Voice Volume" can_edit_text="true" volume="true" width="218"/>
<button bottom_delta="0" control_name="MuteVoice" follows="top|right" height="16" image_selected="icn_speaker-muted_dark.tga" image_unselected="icn_speaker_dark.tga" label="" label_width="55" left="150" name="mute_voice" tab_stop="false" toggle="true" width="25"/>
<slider bottom_delta="-20" control_name="AudioLevelSFX" follows="top" height="15" increment="0.05" initial_val="0.5" label="Sounds" label_width="55" left="10" max_val="1" min_val="0" name="SFX Volume" can_edit_text="true" volume="true" width="218"/>
<button bottom_delta="0" control_name="MuteSounds" follows="top|right" height="16" image_selected="icn_speaker-muted_dark.tga" image_unselected="icn_speaker_dark.tga" label="" label_width="55" left="150" name="mute_sfx" tab_stop="false" toggle="true" width="25"/>
<slider bottom_delta="-20" control_name="AudioLevelAmbient" follows="top" height="15" increment="0.05" initial_val="0.5" label="Ambient" label_width="55" left="10" max_val="1" min_val="0" name="Wind Volume" can_edit_text="true" volume="true" width="218"/>
<button bottom_delta="0" control_name="MuteAmbient" follows="top|right" height="16" image_selected="icn_speaker-muted_dark.tga" image_unselected="icn_speaker_dark.tga" label="" label_width="55" left="150" name="mute_wind" toggle="true" width="25"/>
<slider bottom_delta="-20" control_name="AudioLevelUI" follows="top" height="15" increment="0.05" initial_val="0.5" label="UI" label_width="55" left="10" max_val="1" min_val="0" name="UI Volume" can_edit_text="true" volume="true" width="218"/>
<button bottom_delta="0" control_name="MuteUI" follows="top|right" height="16" image_selected="icn_speaker-muted_dark.tga" image_unselected="icn_speaker_dark.tga" label="" label_width="55" left="150" name="mute_ui" toggle="true" width="25"/>
</panel>

View File

@@ -1,209 +1,54 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel top="20" left="10" height="400" width="512" follows="left|top|right|bottom"
border="true" label="Vanity" name="ascvan" enabled="true" mouse_opaque="true">
<tab_container label="Singularity Vanity" bottom="0" height="440" width="497" left="0"
name="Ascent Vanity" tab_min_width="90" tab_position="top">
<panel border="true" left="1" bottom="-190" height="180" width="500" mouse_opaque="true"
follows="left|top|right|bottom" label="General" name="General">
<check_box bottom_delta="-25" control_name="AscentStoreSettingsPerAccount" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Where applicable, save Vanity settings per-account." left="10"
tool_tip="Saves settings per-account, allowing easier customization for alts."
mouse_opaque="true" name="use_account_settings_check" radio_style="false"
width="400" />
<check_box bottom_delta="-20" control_name="AscentDisableTeleportScreens" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Hide the Teleport progress screens" left="10"
tool_tip="If checked, the viewer will hide the teleport progress screen, allowing you to continue to read IMs."
mouse_opaque="true" name="disable_tp_screen_check" radio_style="false"
width="400" />
<check_box bottom_delta="-20" control_name="OptionPlayTpSound" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Play the Teleport sound when moving between sims" left="10"
tool_tip="Viewer will play the wooshing TP noise on teleport."
mouse_opaque="true" name="tp_sound_check" radio_style="false"
width="400" />
<check_box bottom_delta="-20" control_name="AscentDisableLogoutScreens" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Hide the Login/Logout progress screens" left="10"
tool_tip="If checked, the viewer will hide the login/logout progress screen."
mouse_opaque="true" name="disable_logout_screen_check" radio_style="false"
width="400" />
<panel top="20" left="10" height="400" width="512" border="true" label="Vanity" name="ascvan">
<tab_container label="Singularity Vanity" bottom="0" height="440" width="497" name="Ascent Vanity" tab_min_width="90">
<panel border="true" left="1" bottom="-190" height="180" width="500" label="Main (General)" name="General">
<check_box bottom_delta="-25" control_name="AscentStoreSettingsPerAccount" follows="top" height="16" initial_value="true" label="Where applicable, save Vanity settings per-account." left="10" tool_tip="Saves settings per-account, allowing easier customization for alts." name="use_account_settings_check"/>
<check_box bottom_delta="-20" control_name="AscentDisableTeleportScreens" follows="top" height="16" initial_value="true" label="Hide the Teleport progress screens" tool_tip="If checked, the viewer will hide the teleport progress screen, allowing you to continue to read IMs." name="disable_tp_screen_check"/>
<check_box bottom_delta="-20" control_name="OptionPlayTpSound" follows="top" height="16" initial_value="true" label="Play the Teleport sound when moving between sims" tool_tip="Viewer will play the wooshing TP noise on teleport." name="tp_sound_check"/>
<check_box bottom_delta="-20" control_name="AscentDisableLogoutScreens" follows="top" height="16" initial_value="true" label="Hide the Login/Logout progress screens" tool_tip="If checked, the viewer will hide the login/logout progress screen." name="disable_logout_screen_check"/>
</panel>
<panel border="true" left="1" bottom="-190" height="180" width="500" mouse_opaque="true"
follows="left|top|right|bottom" label="Tags/Colors" name="TagsColors">
<panel border="true" left="1" bottom="-190" height="180" width="500" label="Tags/Colors" name="TagsColors">
<!-- Client tag options -->
<check_box bottom_delta="-25" control_name="AscentUseTag" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Use Client Tag:" left="10"
tool_tip="Enabling this will show your client tag on your avatar name locally."
mouse_opaque="true" name="show_my_tag_check" radio_style="false"
width="400" />
<combo_box allow_text_entry="false" enabled="true" follows="left|top"
bottom_delta="-24" height="18" hidden="false" left_delta="24" max_chars="20" mouse_opaque="true"
tool_tip="The client tag (And subsequent color) to broadcast. Overridden locally by Custom Tag/Color."
name="tag_spoofing_combobox" width="130">
<combo_item type="string" length="1" enabled="true" name="Ascent"
value="f25263b7-6167-4f34-a4ef-af65213b2e39">
Singularity
</combo_item>
<check_box bottom_delta="-25" control_name="AscentUseTag" follows="top" height="16" initial_value="true" label="Use Client Tag:" left="10" tool_tip="Enabling this will show your client tag on your avatar name locally." name="show_my_tag_check"/>
<combo_box follows="top" bottom_delta="-24" height="18" left_delta="24" max_chars="32" tool_tip="The client tag (And subsequent color) to broadcast. Overridden locally by Custom Tag/Color." name="tag_spoofing_combobox" width="130">
<combo_item name="Singularity" value="f25263b7-6167-4f34-a4ef-af65213b2e39">Singularity</combo_item>
</combo_box>
<check_box bottom_delta="-23" control_name="AscentShowSelfTag" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Display client tag to self" left_delta="-24"
tool_tip="Choose whether others see that you enjoy Singularity."
mouse_opaque="true" name="show_self_tag_check" radio_style="false"
width="400" />
<check_box bottom_delta="-20" control_name="AscentShowSelfTagColor" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Display client tag color to self" left_delta="0"
tool_tip="Enabling this set your avatar name color to your client tag color or custom set color."
mouse_opaque="true" name="show_self_tag_color_check" radio_style="false"
width="400" />
<check_box bottom_delta="-20" control_name="AscentShowFriendsTag" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Display friend client tags as (Friend)" left_delta="0"
tool_tip="Enabling this changes your friends' client tags to (Friend)."
mouse_opaque="true" name="show_friend_tag_check" radio_style="false"
width="400" />
<check_box bottom_delta="-23" control_name="AscentShowSelfTag" follows="top" height="16" initial_value="true" label="Display client tag to self" left_delta="-24" tool_tip="Choose whether others see that you enjoy Singularity." name="show_self_tag_check"/>
<check_box bottom_delta="-20" control_name="AscentShowSelfTagColor" follows="top" height="16" initial_value="true" label="Display client tag color to self" tool_tip="Enabling this set your avatar name color to your client tag color or custom set color." name="show_self_tag_color_check"/>
<check_box bottom_delta="-20" control_name="AscentShowFriendsTag" follows="top" height="16" initial_value="true" label="Display friend client tags as (Friend)" tool_tip="Enabling this changes your friends' client tags to (Friend)." name="show_friend_tag_check"/>
<!-- End of Left Side -->
<check_box bottom_delta="87" control_name="AscentUseCustomTag" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Use a custom color and label (Local only)" left_delta="230"
tool_tip="Enabling this will let you set your own name tag to show up with your custom client and tag color. This only shows up to yourself."
mouse_opaque="true" name="customize_own_tag_check" radio_style="false"
width="400" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-17" left_delta="25" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10"
mouse_opaque="true" name="custom_tag_label_text" v_pad="0" width="394">
Label:
</text>
<line_editor bottom_delta="-6" enabled="true" follows="left|top" font="SansSerif"
height="18" left_delta="35" name="custom_tag_label_box"
tool_tip="The custom string you would like to replace your client tag with (Local only)"
width="100" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="6" left_delta="110" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10"
mouse_opaque="true" name="custom_tag_color_text" v_pad="0" width="394">
Color:
</text>
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom_delta="-22"
can_apply_immediately="false" color="1 1 1 1"
enabled="true" follows="left|top" height="34" label="" left_delta="35"
mouse_opaque="true" name="custom_tag_color_swatch" control_name="AscentCustomTagColor"
tool_tip="The custom color you would like to replace your client color with (Local only)" width="30" />
<check_box bottom_delta="-8" control_name="AscentShowOthersTag" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Display client tag for others" left_delta="-205"
tool_tip="Enabling this will show client tag names on others' avatar names."
mouse_opaque="true" name="show_other_tag_check" radio_style="false"
width="400" />
<check_box bottom_delta="-20" control_name="AscentShowOthersTagColor" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Display client tag color for others" left_delta="0"
tool_tip="Enabling this sets others' avatar name color to their client's color."
mouse_opaque="true" name="show_client_tag_color_check" radio_style="false"
width="400" />
<check_box bottom_delta="-20" control_name="AscentShowIdleTime" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Show Idle Time" left_delta="0"
tool_tip="Enabling this will show the amount of time an avatar has been idle."
mouse_opaque="true" name="show_idle_time_check" radio_style="false"
width="400" />
<check_box bottom_delta="-20" control_name="AscentUpdateTagsOnLoad" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Automatically check website for updates to client definitions" left_delta="-230"
tool_tip="Enabling this will allow Singularity to download fresh definitions when needed."
mouse_opaque="true" name="update_tags_check" radio_style="false"
width="400" />
<button bottom_delta="0" control_name="ManualUpdate" name="update_clientdefs" follows="left|top"
label="Manual Update" height="18" left_delta="340" width="110"/>
<check_box bottom_delta="87" control_name="AscentUseCustomTag" follows="top" height="16" initial_value="true" label="Use a custom color and label (Local only)" left_delta="230" tool_tip="Enabling this will let you set your own name tag to show up with your custom client and tag color. This only shows up to yourself." name="customize_own_tag_check"/>
<text bottom_delta="-17" left_delta="25" follows="top" height="10" name="custom_tag_label_text">Label:</text>
<line_editor bottom_delta="-6" follows="top" font="SansSerif" height="18" left_delta="35" name="custom_tag_label_box" tool_tip="The custom string you would like to replace your client tag with (Local only)" width="100"/>
<text bottom_delta="6" left_delta="110" follows="top" height="10" name="custom_tag_color_text">Color:</text>
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom_delta="-22" can_apply_immediately="false" color="1 1 1 1" follows="top" height="34" left_delta="35" name="custom_tag_color_swatch" control_name="AscentCustomTagColor" tool_tip="The custom color you would like to replace your client color with (Local only)" width="30" />
<check_box bottom_delta="-8" control_name="AscentShowOthersTag" follows="top" height="16" initial_value="true" label="Display client tag for others" left_delta="-205" tool_tip="Enabling this will show client tag names on others' avatar names." name="show_other_tag_check"/>
<check_box bottom_delta="-20" control_name="AscentShowOthersTagColor" follows="top" height="16" initial_value="true" label="Display client tag color for others" left_delta="0" tool_tip="Enabling this sets others' avatar name color to their client's color." name="show_client_tag_color_check"/>
<check_box bottom_delta="-20" control_name="AscentShowIdleTime" follows="top" height="16" initial_value="true" label="Show Idle Time" tool_tip="Enabling this will show the amount of time an avatar has been idle." name="show_idle_time_check"/>
<check_box bottom_delta="-20" control_name="AscentUpdateTagsOnLoad" follows="top" height="16" initial_value="true" label="Automatically check website for updates to client definitions" left_delta="-230" tool_tip="Enabling this will allow Singularity to download fresh definitions when needed." name="update_tags_check"/>
<button bottom_delta="0" control_name="ManualUpdate" name="update_clientdefs" follows="top" label="Manual Update" height="18" left_delta="340" width="110"/>
<!-- End of Client Tag settings -->
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-25" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="20"
mouse_opaque="true" name="effects_color_textbox" v_pad="0" width="394">
Color For My Effects:
</text>
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom_delta="-34"
can_apply_immediately="true" color="1 1 1 1" control_name="EffectColor"
enabled="true" follows="left|top" height="47" label="Effects" left_delta="138"
mouse_opaque="true" name="effect_color_swatch" width="44" />
<check_box bottom_delta="-20" control_name="AscentUseStatusColors" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Use user status colors (Friend, Linden, etcetera below)" left="10"
tool_tip="Enabling this will show people who match specific criteria (Lindens, Estate owners, friends, muted people) with the color you've set below."
mouse_opaque="true" name="use_status_check" radio_style="false"
width="400" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-20" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left_delta="10"
mouse_opaque="true" name="friends_color_textbox" v_pad="0" width="394">
Color For:
(Radar, Tag, Minimap)
</text>
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom_delta="-34"
can_apply_immediately="true" color="1 1 1 1" control_name="AscentFriendColor"
enabled="true" follows="left|top" height="47" label="Friends" left_delta="138"
mouse_opaque="true" name="friend_color_swatch" width="44" tool_tip="Color of Friends" />
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom_delta="0"
can_apply_immediately="true" color="1 1 1 1" control_name="AscentEstateOwnerColor"
enabled="true" follows="left|top" height="47" label="Estate" left_delta="54"
mouse_opaque="true" name="estate_owner_color_swatch" width="44" tool_tip="Color of Estate Managers" />
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom_delta="0"
can_apply_immediately="true" color="0.6 0.6 1 1" control_name="AscentLindenColor"
enabled="true" follows="left|top" height="47" label="Lindens" left_delta="54"
mouse_opaque="true" name="linden_color_swatch" width="44" tool_tip="Color of Lindens" />
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom_delta="0"
can_apply_immediately="true" color="0.8 1 1 1" control_name="AscentMutedColor"
enabled="true" follows="left|top" height="47" label="Muted" left_delta="54"
mouse_opaque="true" name="muted_color_swatch" width="44" tool_tip="Color of Muted" />
<text bottom_delta="-25" follows="top" height="10" left="20" name="effects_color_textbox">Color For My Effects:</text>
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom_delta="-34" can_apply_immediately="true" color="1 1 1 1" control_name="EffectColor" follows="top" height="47" label="Effects" left_delta="138" name="effect_color_swatch" width="44"/>
<check_box bottom_delta="-20" control_name="AscentUseStatusColors" follows="top" height="16" initial_value="true" label="Use user status colors (Friend, Linden, etcetera below)" left="10" tool_tip="Enabling this will show people who match specific criteria (Lindens, Estate owners, friends, muted people) with the color you've set below." name="use_status_check"/>
<text bottom_delta="-20" follows="top" height="10" left_delta="10" name="friends_color_textbox">Color For:
(Radar, Tag, Minimap)</text>
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom_delta="-34" can_apply_immediately="true" color="1 1 1 1" control_name="AscentFriendColor" follows="top" height="47" label="Friends" left_delta="138" name="friend_color_swatch" width="44" tool_tip="Color of Friends"/>
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom_delta="0" can_apply_immediately="true" color="1 1 1 1" control_name="AscentEstateOwnerColor" follows="top" height="47" label="Estate" left_delta="54" name="estate_owner_color_swatch" width="44" tool_tip="Color of Estate Managers"/>
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom_delta="0" can_apply_immediately="true" color="0.6 0.6 1 1" control_name="AscentLindenColor" follows="top" height="47" label="Lindens" left_delta="54" name="linden_color_swatch" width="44" tool_tip="Color of Lindens"/>
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom_delta="0" can_apply_immediately="true" color="0.8 1 1 1" control_name="AscentMutedColor" follows="top" height="47" label="Muted" left_delta="54" name="muted_color_swatch" width="44" tool_tip="Color of Muted"/>
</panel>
<panel border="true" left="1" bottom="-190" height="180" width="500" mouse_opaque="true"
follows="left|top|right|bottom" label="Body Dynamics" name="Body Dynamics">
<check_box bottom_delta="-25" enabled="true" follows="left|top" font="SansSerifSmall" height="16"
label="Enable enhanced physics on avatar breasts" left="10" mouse_opaque="true" name="EmBreastsToggle"
control_name="EmeraldBreastPhysicsToggle" width="126"/>
<slider bottom_delta="-20" left="10" name="EmeraldBoobMass" control_name="EmeraldBoobMass"
decimal_digits="0" enabled="true" follows="left|top" height="18" increment="1"
label="Breast mass:" label_width="100" max_val="100" min_val="1" mouse_opaque="true"
show_text="true" width="250" auto_resize="false" tool_tip=""/>
<slider bottom_delta="-20" left_delta="0" name="EmeraldBoobHardness" control_name="EmeraldBoobHardness"
decimal_di:wqgits="0" enabled="true" follows="left|top" height="18" increment="1"
label="Breast rebound:" label_width="100" max_val="100" min_val="1" mouse_opaque="true"
show_text="true" width="250" auto_resize="false" tool_tip=""/>
<slider bottom_delta="-20" left_delta="0" name="EmeraldBoobVelMax" control_name="EmeraldBoobVelMax"
decimal_digits="0" enabled="true" follows="left|top" height="18" increment="1"
label="Breast max vel:" label_width="100" max_val="100" min_val="1" mouse_opaque="true"
show_text="true" width="250" auto_resize="false" tool_tip=""/>
<slider bottom_delta="-20" left_delta="0" name="EmeraldBoobFriction" control_name="EmeraldBoobFriction"
decimal_digits="0" enabled="true" follows="left|top" height="18" increment="1"
label="Breast friction:" label_width="100" max_val="100" min_val="1" mouse_opaque="true"
show_text="true" width="250" auto_resize="false" tool_tip=""/>
<slider bottom_delta="-20" left_delta="0" name="EmeraldBoobVelMin" control_name="EmeraldBoobVelMin"
decimal_digits="0" enabled="true" follows="left|top" height="18" increment="1"
label="Breast min vel:" label_width="100" max_val="100" min_val="1" mouse_opaque="true"
show_text="true" width="250" auto_resize="false" tool_tip=""/>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-20" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="15" left="10"
mouse_opaque="true" name="av_mod_textbox" v_pad="0" width="394">
Avatar Offset Modifiers
</text>
<spinner bottom_delta="-20" decimal_digits="5" follows="left|top" height="16" increment="0.05"
label="X Modifier" label_width="65" left_delta="5" max_val="0.15" min_val="-0.15"
mouse_opaque="true" name="X Modifier" width="128" control_name="AscentAvatarXModifier"
tool_tip="Use this to manipulate, to a degree, your avatar bounding box. This can be used to distort orbiters, or to raise you up or down without altering your shape."/>
<spinner bottom_delta="-20" decimal_digits="5" follows="left|top" height="16" increment="0.05"
label="Y Modifier" label_width="65" left_delta="0" max_val="0.20" min_val="-0.20"
mouse_opaque="true" name="Y Modifier" width="128" control_name="AscentAvatarYModifier"
tool_tip="Use this to manipulate, to a degree, your avatar bounding box. This can be used to distort orbiters, or to raise you up or down without altering your shape."/>
<spinner bottom_delta="-20" decimal_digits="5" follows="left|top" height="16" increment="0.1"
label="Z Modifier" label_width="65" left_delta="0" max_val="5.0" min_val="-5.0"
mouse_opaque="true" name="Z Modifier" width="128" control_name="AscentAvatarZModifier"
tool_tip="Use this to manipulate, to a degree, your avatar bounding box. This can be used to distort orbiters, or to raise you up or down without altering your shape."/>
<panel border="true" left="1" bottom="-190" height="180" width="500" label="Body Dynamics" name="Body Dynamics">
<check_box bottom_delta="-25" follows="top" height="16" label="Enable enhanced physics on avatar breasts" left="10" name="EmBreastsToggle" control_name="EmeraldBreastPhysicsToggle" tool_tip="You must hit apply before these controls will activate or deactivate"/>
<slider bottom_delta="-20" left="10" name="EmeraldBoobMass" control_name="EmeraldBoobMass" decimal_digits="0" follows="top" height="18" increment="1" label="Breast mass:" label_width="100" max_val="100" min_val="1" can_edit_text="true" width="250"/>
<slider bottom_delta="-20" left_delta="0" name="EmeraldBoobHardness" control_name="EmeraldBoobHardness" decimal_digits="0" follows="top" height="18" increment="1" label="Breast rebound:" label_width="100" max_val="100" min_val="1" can_edit_text="true" width="250"/>
<slider bottom_delta="-20" name="EmeraldBoobVelMax" control_name="EmeraldBoobVelMax" decimal_digits="0" follows="top" height="18" increment="1" label="Breast max vel:" label_width="100" max_val="100" min_val="1" can_edit_text="true" width="250"/>
<slider bottom_delta="-20" name="EmeraldBoobFriction" control_name="EmeraldBoobFriction" decimal_digits="0" follows="top" height="18" increment="1" label="Breast friction:" label_width="100" max_val="100" min_val="1" can_edit_text="true" width="250"/>
<slider bottom_delta="-20" name="EmeraldBoobVelMin" control_name="EmeraldBoobVelMin" decimal_digits="0" follows="top" height="18" increment="1" label="Breast min vel:" label_width="100" max_val="100" min_val="1" can_edit_text="true" width="250"/>
<text bottom_delta="-20" height="15" left="10" name="av_mod_textbox" follows="top">Avatar Offset Modifiers</text>
<spinner bottom_delta="-20" decimal_digits="5" follows="top" height="16" increment="0.05" label="X Modifier" label_width="65" left_delta="5" max_val="0.15" min_val="-0.15" name="X Modifier" width="128" control_name="AscentAvatarXModifier" tool_tip="Use this to manipulate, to a degree, your avatar bounding box. This can be used to distort orbiters, or to raise you up or down without altering your shape."/>
<spinner bottom_delta="-20" decimal_digits="5" follows="top" height="16" increment="0.05" label="Y Modifier" label_width="65" max_val="0.20" min_val="-0.20" name="Y Modifier" width="128" control_name="AscentAvatarYModifier" tool_tip="Use this to manipulate, to a degree, your avatar bounding box. This can be used to distort orbiters, or to raise you up or down without altering your shape."/>
<spinner bottom_delta="-20" decimal_digits="5" follows="top" height="16" increment="0.1" label="Z Modifier" label_width="65" max_val="5.0" min_val="-5.0" name="Z Modifier" width="128" control_name="AscentAvatarZModifier" tool_tip="Use this to manipulate, to a degree, your avatar bounding box. This can be used to distort orbiters, or to raise you up or down without altering your shape."/>
</panel>
</tab_container>
</panel>

View File

@@ -1,70 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel border="true" bottom="-409" enabled="true" follows="left|top|right|bottom"
height="408" label="Audio &amp; Video" left="102" mouse_opaque="true"
name="Media panel" width="517">
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-22" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="12" left="10"
mouse_opaque="true" name="muting_text" v_pad="0" width="128">
Volume:
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-215" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="12" left="10"
mouse_opaque="true" name="streaming_prefs_text" v_pad="0" width="128">
Streaming Preferences:
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-300" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="12" left="10"
mouse_opaque="true" name="audio_prefs_text" v_pad="0" width="128">
Audio Preferences:
</text>
<panel border="true" bottom="-195" enabled="true" filename="panel_audio.xml"
follows="left|top|right|bottom" height="180" label="Volume" left="148"
mouse_opaque="true" name="Volume Panel" width="260" />
<check_box bottom="-220" control_name="AudioStreamingMusic" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Play Streaming Music When Available (uses more bandwidth)"
left="142" mouse_opaque="true" name="streaming_music" radio_style="false"
width="339" />
<check_box bottom_delta="-20" control_name="AudioStreamingVideo" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Play Streaming Media When Available (uses more bandwidth)"
left="142" mouse_opaque="true" name="streaming_video" radio_style="false"
width="338" />
<check_box bottom_delta="-20" control_name="ParcelMediaAutoPlayEnable" enabled="true"
follows="left|top" font="SansSerifSmall" height="16"
initial_value="true" label="Automatically play media" left="162"
mouse_opaque="true" name="auto_streaming_video" radio_style="false"
width="338" />
<check_box bottom_delta="-20" control_name="MediaEnableFilter" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Ask for permission (enables filtering)"
left="162" mouse_opaque="true" name="streaming_video" radio_style="false"
width="338" />
<check_box bottom_delta="-25" control_name="MuteWhenMinimized" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Mute Audio When Window Minimized" left="142" mouse_opaque="true"
name="mute_when_minimized" radio_style="false" width="215" />
<slider bottom_delta="-20" control_name="AudioLevelDoppler" edit_text="true"
enabled="true" follows="left|top" height="15" increment="0.1"
initial_val="1" label="Doppler Effect" label_width="100" left="148"
max_val="2" min_val="0" mouse_opaque="true" name="Doppler Effect"
show_text="true" width="250" />
<slider bottom_delta="-20" control_name="AudioLevelRolloff" edit_text="true"
enabled="true" follows="left|top" height="15" increment="0.1"
initial_val="1" label="Rolloff Factor" label_width="100" left="148"
max_val="2" min_val="0" mouse_opaque="true" name="Rolloff Factor"
show_text="true" width="250" />
<spinner bottom_delta="-20" control_name="UISndMoneyChangeThreshold" decimal_digits="0"
enabled="true" follows="left|top" height="16" increment="10"
initial_val="10" label="[CURRENCY] change threshold:" label_width="128" left="148"
max_val="10000" min_val="0" mouse_opaque="true" name="currency_change_threshold"
width="192" />
<spinner bottom_delta="-20" control_name="UISndHealthReductionThreshold"
decimal_digits="0" enabled="true" follows="left|top" height="16"
increment="10" initial_val="20" label="Health Change Threshold"
label_width="128" left="148" max_val="10000" min_val="0"
mouse_opaque="true" name="Health Change Threshold" width="192" />
<panel border="true" bottom="-409" height="408" label="Audio &amp; Video" left="102" name="Media panel" width="517">
<text bottom="-22" height="12" left="10" name="muting_text">Volume:</text>
<text bottom="-215" name="streaming_prefs_text">Streaming Preferences:</text>
<text bottom="-300" height="12" name="audio_prefs_text">Audio Preferences:</text>
<panel border="true" bottom="-195" filename="panel_audio.xml" height="180" label="Volume" left="148" name="Volume Panel" width="260"/>
<check_box bottom="-220" control_name="AudioStreamingMusic" height="16" initial_value="true" label="Play Streaming Music When Available (uses more bandwidth)" left="142" name="streaming_music"/>
<check_box bottom_delta="-20" control_name="AudioStreamingVideo" follows="top" height="16" initial_value="true" label="Play Streaming Media When Available (uses more bandwidth)" name="streaming_video"/>
<check_box bottom_delta="-20" control_name="ParcelMediaAutoPlayEnable" follows="top" height="16" initial_value="true" label="Automatically play media" left="162" name="auto_streaming_video"/>
<check_box bottom_delta="-20" control_name="MediaEnableFilter" follows="top" height="16" initial_value="true" label="Ask for permission (enables filtering)" name="streaming_video"/>
<check_box bottom_delta="-25" control_name="MuteWhenMinimized" follows="top" height="16" initial_value="true" label="Mute Audio When Window Minimized" left="142" name="mute_when_minimized"/>
<slider bottom_delta="-20" control_name="AudioLevelDoppler" edit_text="true" follows="top" height="15" increment="0.1" initial_val="1" label="Doppler Effect" label_width="100" left="148" max_val="2" min_val="0" name="Doppler Effect" show_text="true" width="250" />
<slider bottom_delta="-20" control_name="AudioLevelRolloff" edit_text="true" follows="top" height="15" increment="0.1" initial_val="1" label="Rolloff Factor" label_width="100" max_val="2" min_val="0" name="Rolloff Factor" width="250"/>
<spinner bottom_delta="-20" control_name="UISndMoneyChangeThreshold" decimal_digits="0" follows="top" height="16" increment="10" initial_val="10" label="[CURRENCY] change threshold:" label_width="128" max_val="10000" min_val="0" name="currency_change_threshold" width="192"/>
<spinner bottom_delta="-20" control_name="UISndHealthReductionThreshold" decimal_digits="0" follows="top" height="16" increment="10" initial_val="20" label="Health Change Threshold" label_width="128" max_val="10000" min_val="0" name="Health Change Threshold" width="192" />
</panel>

View File

@@ -1,232 +1,60 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel border="true" bottom="-499" enabled="true" follows="left|top|right|bottom"
height="548" label="Text Chat" left="102" mouse_opaque="true" name="chat"
width="517">
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-20" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="12"
mouse_opaque="false" name="text_box" v_pad="0" width="128">
Chat Font Size:
</text>
<radio_group bottom="-40" draw_border="true" enabled="true"
follows="left|top" height="30" left="148" mouse_opaque="true"
name="chat_font_size" width="331">
<radio_item type="string" length="1" bottom="-24" enabled="true" height="16" left="0" mouse_opaque="true"
name="radio" width="98">
Small
</radio_item>
<radio_item type="string" length="1" bottom="-24" enabled="true" height="16" left="110" mouse_opaque="true"
name="radio2" width="98">
Medium
</radio_item>
<radio_item type="string" length="1" bottom="-24" enabled="true" height="16" left="220" mouse_opaque="true"
name="radio3" width="98">
Large
</radio_item>
<panel border="true" bottom="-499" height="548" label="Text Chat" left="102" name="chat" width="517">
<text bottom="-20" height="10" left="12" name="text_box">Chat Font Size:</text>
<radio_group bottom="-40" draw_border="true" height="30" left="148" name="chat_font_size" width="290">
<radio_item bottom="-24" height="16" left="0" name="radio" width="98">Small</radio_item>
<radio_item bottom="-24" height="16" left="110" name="radio2" width="98">Medium</radio_item>
<radio_item bottom="-24" height="16" left="220" name="radio3" width="98">Large</radio_item>
</radio_group>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-64" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="12"
mouse_opaque="false" name="text_box2" v_pad="0" width="128">
Chat Color:
</text>
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-100"
can_apply_immediately="true" color="1 1 1 1" control_name="UserChatColor"
enabled="true" follows="left|top" height="47" label="You" left="148"
mouse_opaque="true" name="user" width="44" />
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-100"
can_apply_immediately="true" color="1 1 1 1" control_name="AgentChatColor"
enabled="true" follows="left|top" height="47" label="Others" left_delta="54"
mouse_opaque="true" name="agent" width="44" />
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-100"
can_apply_immediately="true" color="0.6 0.6 1 1"
enabled="true" follows="left|top" height="47" label="IM" left_delta="54"
mouse_opaque="true" name="im" width="44" />
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-100"
can_apply_immediately="true" color="0.8 1 1 1"
enabled="true" follows="left|top" height="47" label="System" left_delta="54"
mouse_opaque="true"
name="system" width="44" />
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-100"
can_apply_immediately="true" color="0.82 0.82 0.99 1"
control_name="ScriptErrorColor" enabled="true" follows="left|top"
height="47" label="Errors" left_delta="54" mouse_opaque="true"
name="script_error" width="44" />
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-150"
can_apply_immediately="true" color="0.7 0.9 0.7 1"
control_name="ObjectChatColor" enabled="true" follows="left|top"
height="47" label="Objects" left="148" mouse_opaque="true"
name="objects" width="44" />
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-150"
can_apply_immediately="true" color="0.7 0.9 0.7 1"
enabled="true" follows="left|top"
height="47" label="Owner" left_delta="54" mouse_opaque="true" name="owner"
width="44" />
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-150"
can_apply_immediately="true" color="0 0 0 1"
enabled="true" follows="left|top"
height="47" label="Bubble" left_delta="54" mouse_opaque="true"
name="background" width="44" />
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-150"
can_apply_immediately="true" color="0.6 0.6 1 1"
enabled="true" follows="left|top" height="47"
label="URLs" left_delta="54" mouse_opaque="true" name="links" width="44" />
<text bottom="-64" height="10" left="12" name="text_box2">Chat Color:</text>
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-100" can_apply_immediately="true" color="1 1 1 1" control_name="UserChatColor" follows="top" height="47" label="You" left="148" name="user" width="44"/>
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-100" can_apply_immediately="true" color="1 1 1 1" control_name="AgentChatColor" follows="top" height="47" label="Others" left_delta="54" name="agent" width="44"/>
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-100" can_apply_immediately="true" color="0.6 0.6 1 1" follows="top" height="47" label="IM" left_delta="54" name="im" width="44"/>
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-100" can_apply_immediately="true" color="0.8 1 1 1" follows="top" height="47" label="System" left_delta="54" name="system" width="44"/>
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-100" can_apply_immediately="true" color="0.82 0.82 0.99 1" control_name="ScriptErrorColor" enabled="true" follows="top" height="47" label="Errors" left_delta="54" name="script_error" width="44"/>
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-150" can_apply_immediately="true" color="0.7 0.9 0.7 1" control_name="ObjectChatColor" height="47" label="Objects" left="148" mouse_opaque="true" name="objects" width="44"/>
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-150" can_apply_immediately="true" color="0.7 0.9 0.7 1" follows="top" height="47" label="Owner" left_delta="54" name="owner" width="44"/>
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-150" can_apply_immediately="true" color="0 0 0 1" follows="top" height="47" label="Bubble" left_delta="54" name="background" width="44"/>
<color_swatch border_color="0.45098 0.517647 0.607843 1" bottom="-150" can_apply_immediately="true" color="0.6 0.6 1 1" follows="top" height="47" label="URLs" left_delta="54" name="links" width="44"/>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-26" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="12"
mouse_opaque="false" name="text_box3" v_pad="0" width="135">
Chat Console:
</text>
<spinner bottom_delta="-8" control_name="ChatPersistTime" decimal_digits="0"
enabled="true" follows="left|top" height="16" increment="1"
initial_val="10" label="Fade chat after" label_width="80" left="148"
max_val="60" min_val="2" mouse_opaque="true" name="fade_chat_time"
width="130" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="6" drop_shadow_visible="true" enabled="true"
follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
height="10" left="282" mouse_opaque="false" name="text_box4" v_pad="0"
width="80">
(seconds)
</text>
<spinner bottom_delta="-6" decimal_digits="0"
enabled="true" follows="left|top" height="16" increment="1"
initial_val="10" left="340" max_val="50" min_val="1" mouse_opaque="true"
name="max_chat_count" width="60" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="6" drop_shadow_visible="true" enabled="true"
follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
height="10" left="405" mouse_opaque="false" name="text_box5" v_pad="0"
width="60">
(# lines)
</text>
<slider bottom_delta="-25" can_edit_text="false" control_name="ConsoleBackgroundOpacity"
decimal_digits="3" enabled="true" follows="left|top" height="12"
increment="0.05" initial_val="1" label="Opacity" left="148" max_val="1"
min_val="0" mouse_opaque="true" name="console_opacity" show_text="true"
value="0.4" width="200" />
<check_box bottom_delta="-25" control_name="ChatFullWidth" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
label="Use full screen width (Requires restart)" left="148"
mouse_opaque="true" name="chat_full_width_check" radio_style="false"
width="239" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-22" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="12"
mouse_opaque="false" name="text_box6" v_pad="0" width="135">
Chat Options:
</text>
<check_box bottom_delta="-8" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
label="Close chat bar after hitting return" left="148" mouse_opaque="true"
name="close_chat_on_return_check" radio_style="false" width="237" />
<check_box bottom_delta="-20" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
label="Arrow keys always move avatar when chatting" left="148"
mouse_opaque="true" name="arrow_keys_move_avatar_check" radio_style="false"
width="237" />
<check_box bottom_delta="-20" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
label="Show timestamps in Local Chat" left="148" mouse_opaque="true"
name="show_timestamps_check" radio_style="false" width="237" />
<check_box bottom_delta="-20" control_name="ScriptErrorsAsChat" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
label="Show script errors and warnings as regular chat" left="148"
mouse_opaque="true" name="script_errors_as_chat" radio_style="false"
width="275" />
<check_box bottom_delta="-20" enabled="true" control_name="PlayTypingAnim"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Play typing animation when chatting" left="148" mouse_opaque="true"
name="play_typing_animation" radio_style="false" width="237" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-365" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="12"
mouse_opaque="false" name="text_box7" v_pad="0" width="128">
Bubble Chat:
</text>
<check_box bottom="-370" control_name="UseChatBubbles" enabled="true" follows="left|top"
font="SansSerifSmall" height="16" initial_value="false"
label="Show chat bubbles" left="148" mouse_opaque="true"
name="bubble_text_chat" radio_style="false" width="237" />
<slider bottom="-386" can_edit_text="false" control_name="ChatBubbleOpacity"
decimal_digits="3" enabled="true" follows="left|top" height="12"
increment="0.05" initial_val="1" label="Opacity" left="148" max_val="1"
min_val="0" mouse_opaque="true" name="bubble_chat_opacity" show_text="true"
value="0.5" width="200" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-410" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="12"
mouse_opaque="false" name="text_translate_chat" v_pad="0" width="128">
Translate Chat:
</text>
<check_box bottom="-417" control_name="TranslateChat" enabled="true" follows="left|top"
font="SansSerifSmall" height="16" initial_value="false"
label="Use machine translation while chatting (powered by Google)" left="148" mouse_opaque="true"
name="translate_chat" radio_style="false" width="237" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-432" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="149"
mouse_opaque="false" name="text_translate_chat" v_pad="0" width="160">
Translate into this language:
</text>
<combo_box allow_text_entry="true" bottom="-438" enabled="true"
follows="left|top" height="16" left_delta="183" max_chars="135"
mouse_opaque="true" name="translate_language_combobox" width="146">
<combo_item type="string" length="1" enabled="true" name="System Default Language" value="default">
System Default
</combo_item>
<combo_item type="string" length="1" enabled="true" name="English" value="en">
English
</combo_item>
<!-- After "System Default" and "English", please keep the rest of these combo_items in alphabetical order by the first character in the string. -->
<combo_item type="string" length="1" enabled="true" name="Danish" value="da">
Dansk (Danish)
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Deutsch(German)" value="de">
Deutsch (German)
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Spanish" value="es">
Español (Spanish)
</combo_item>
<combo_item type="string" length="1" enabled="true" name="French" value="fr">
Français (French)
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Italian" value="it">
Italiano (Italian)
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Hungarian" value="hu">
Magyar (Hungarian)
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Dutch" value="nl">
Nederlands (Dutch)
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Polish" value="pl">
Polski (Polish)
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Portugese" value="pt">
Portugués (Portuguese)
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Russian" value="ru">
Русский (Russian)
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Turkish" value="tr">
Türkçe (Turkish)
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Ukrainian" value="uk">
Українська (Ukrainian)
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Chinese" value="zh">
中文 (简体) (Chinese)
</combo_item>
<combo_item type="string" length="1" enabled="true" name="(Japanese)" value="ja">
日本語 (Japanese)
</combo_item>
<combo_item type="string" length="1" enabled="true" name="(Korean)" value="ko">
한국어 (Korean)
</combo_item>
</combo_box>
<text bottom_delta="-26" follows="top" height="10" left="12" name="text_box3">Chat Console:</text>
<spinner bottom_delta="-8" control_name="ChatPersistTime" decimal_digits="0" follows="top" height="16" increment="1" initial_val="10" label="Fade chat after" label_width="80" left="148" max_val="60" min_val="2" name="fade_chat_time" width="130"/>
<text bottom_delta="6" follows="top" height="10" left="282" name="text_box4">(seconds)</text>
<spinner bottom_delta="-6" decimal_digits="0" follows="top" height="16" increment="1" initial_val="10" left="340" max_val="50" min_val="1" name="max_chat_count" width="60"/>
<text bottom_delta="6" follows="left|top" height="10" left="405" name="text_box5">(# lines)</text>
<slider bottom_delta="-25" control_name="ConsoleBackgroundOpacity" follows="top" height="12" increment="0.05" initial_val="1" label="Opacity" left="148" max_val="1" min_val="0" name="console_opacity" value="0.4" width="200"/>
<check_box bottom_delta="-25" control_name="ChatFullWidth" follows="top" height="16" initial_value="false" label="Use full screen width (Requires restart)" name="chat_full_width_check"/>
<text bottom_delta="-22" height="10" left="12" mouse_opaque="false" name="text_box6" v_pad="0" width="135">Chat Options:</text>
<check_box bottom_delta="-8" follows="top" height="16" initial_value="false" label="Close chat bar after hitting return" left="148" name="close_chat_on_return_check"/>
<check_box bottom_delta="-20" follows="top" height="16" initial_value="false" label="Arrow keys always move avatar when chatting" name="arrow_keys_move_avatar_check"/>
<check_box bottom_delta="-20" follows="top" height="16" initial_value="false" label="Show timestamps in Local Chat" name="show_timestamps_check"/>
<check_box bottom_delta="-20" control_name="ScriptErrorsAsChat" follows="top" height="16" initial_value="false" label="Show script errors and warnings as regular chat" name="script_errors_as_chat"/>
<check_box bottom_delta="-20" control_name="PlayTypingAnim" follows="top" height="16" initial_value="true" label="Play typing animation when chatting" name="play_typing_animation"/>
<text bottom="-365" height="10" left="12" name="text_box7">Bubble Chat:</text>
<check_box bottom="-370" control_name="UseChatBubbles" height="16" initial_value="false" label="Show chat bubbles" left="148" name="bubble_text_chat"/>
<slider bottom="-386" can_edit_text="false" control_name="ChatBubbleOpacity" height="12" increment="0.05" initial_val="1" label="Opacity" max_val="1" min_val="0" name="bubble_chat_opacity" value="0.5" width="200"/>
<!--
<text bottom="-410" height="10" left="12" name="text_translate_chat">Translate Chat:</text>
<check_box bottom="-417" control_name="TranslateChat" height="16" initial_value="false" label="Use machine translation while chatting (powered by Google)" left="148" name="translate_chat"/>
<text bottom="-432" height="10" left="149" name="text_translate_chat">Translate into this language:</text>
<combo_box allow_text_entry="true" bottom="-438" follows="top" height="16" left_delta="183" max_chars="135" name="translate_language_combobox" width="146">
<combo_item name="System Default Language" value="default">System Default</combo_item>
<combo_item name="English" value="en">English</combo_item>
<!- After "System Default" and "English", please keep the rest of these combo_items in alphabetical order by the first character in the string. ->
<combo_item name="Danish" value="da">Dansk (Danish)</combo_item>
<combo_item name="Deutsch(German)" value="de">Deutsch (German)</combo_item>
<combo_item name="Spanish" value="es">Español (Spanish)</combo_item>
<combo_item name="French" value="fr">Français (French)</combo_item>
<combo_item name="Italian" value="it">Italiano (Italian)</combo_item>
<combo_item name="Hungarian" value="hu">Magyar (Hungarian)</combo_item>
<combo_item name="Dutch" value="nl">Nederlands (Dutch)</combo_item>
<combo_item name="Polish" value="pl">Polski (Polish)</combo_item>
<combo_item name="Portugese" value="pt">Portugués (Portuguese)</combo_item>
<combo_item name="Russian" value="ru">Русский (Russian)</combo_item>
<combo_item name="Turkish" value="tr">Türkçe (Turkish)</combo_item>
<combo_item name="Ukrainian" value="uk">Українська (Ukrainian)</combo_item>
<combo_item name="Chinese" value="zh">中文 (简体) (Chinese)</combo_item>
<combo_item name="(Japanese)" value="ja">日本語 (Japanese)</combo_item>
<combo_item name="(Korean)" value="ko">한국어 (Korean)</combo_item>
</combo_box>-->
</panel>

View File

@@ -1,249 +1,71 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel border="true" bottom="-409" enabled="true" follows="left|top|right|bottom"
height="408" label="General" left="102" mouse_opaque="true"
name="general_panel" width="517">
<radio_group bottom="-45" draw_border="false" follows="left|top" height="40" left="151"
name="default_start_location" width="220">
<radio_item bottom="-20" height="20" left="0" name="MyHome" width="50"
tool_tip="Log into my home location by default.">
My Home
</radio_item>
<radio_item bottom="-20" height="20" left="100" name="MyLastLocation" width="50"
tool_tip="Log into my last location by default.">
My Last Location
</radio_item>
<panel border="true" bottom="-409" height="408" label="General" left="102" name="general_panel" width="517">
<radio_group bottom="-44" height="40" left="109" name="default_start_location" width="199">
<radio_item bottom="-20" height="20" name="MyHome" tool_tip="Log into my home location by default.">My Home</radio_item>
<radio_item bottom="-20" height="20" left="93" name="MyLastLocation" tool_tip="Log into my last location by default.">My Last Location</radio_item>
</radio_group>
<check_box bottom="-44" enabled="true" follows="left|top"
font="SansSerifSmall" height="16" initial_value="true"
label="Show Start Location on Login Screen" left="151" mouse_opaque="true"
name="show_location_checkbox" radio_style="false" width="256" />
<combo_box bottom_delta="-25" follows="left|top" height="18" left="155"
mouse_opaque="true" name="fade_out_combobox" width="146">
<combo_item name="Never" value="Never">
Never
</combo_item>
<combo_item name="Show Temporarily" value="Show Temporarily">
Show Temporarily
</combo_item>
<combo_item name="Always" value="Always">
Always
</combo_item>
<check_box bottom="-42" height="16" initial_value="true" label="Show Start Location on Login Screen" name="show_location_checkbox"/>
<combo_box bottom_delta="-27" follows="top" height="18" left="103" name="fade_out_combobox" width="111">
<combo_item name="Never" value="Never">Never</combo_item>
<combo_item name="Show Temporarily" value="Show Temporarily">Show Temporarily</combo_item>
<combo_item name="Always" value="Always">Always</combo_item>
</combo_box>
<combo_box bottom_delta="0" follows="left|top" height="18" left="330"
mouse_opaque="true" name="namesystem_combobox" width="146">
<combo_item name="Old Names" value="Old Names">
Old Names
</combo_item>
<combo_item name="Display Names (with Username)" value="Display Names (with Username)">
Display Names (with Username)
</combo_item>
<combo_item name="Display Names only" value="Display Names only">
Display Names only
</combo_item>
<combo_box bottom_delta="0" follows="top" height="18" left="220" name="namesystem_combobox" width="166">
<combo_item name="Old Names" value="Old Names">Old Names</combo_item>
<combo_item name="Display Names (with Username)" value="Display Names (with Username)">Display Names(w/Username)</combo_item>
<combo_item name="Display Names only" value="Display Names only">Display Names only</combo_item>
</combo_box>
<check_box bottom_delta="-25" follows="left|top"
font="SansSerifSmall" height="16" initial_value="true"
label="Small Avatar Names" left="151" name="small_avatar_names_checkbox"
width="200" />
<check_box bottom_delta="-18" follows="left|top"
font="SansSerifSmall" height="16" initial_value="false"
label="Hide My Name On My Screen" left="151" name="show_my_name_checkbox"
width="200" />
<text type="string" length="1" bottom_delta="-24" follows="left|top" font="SansSerifSmall" h_pad="0"
halign="left" height="16" left="10" name="group_titles_textbox" v_pad="0"
width="394">
Group Titles:
</text>
<check_box bottom_delta="0" follows="left|top"
font="SansSerifSmall" height="16" initial_value="false"
label="Hide All Group Titles" left="151" mouse_opaque="true"
name="show_all_title_checkbox" radio_style="false" width="256" />
<check_box bottom_delta="-18" follows="left|top"
font="SansSerifSmall" height="16" initial_value="false"
label="Hide My Group Title" left="151" name="show_my_title_checkbox"
radio_style="false" width="256" />
<!--text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-184" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="153"
mouse_opaque="true" name="effects_color_textbox" v_pad="0" width="394">
Moved to Vanity Settings.
</text-->
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-180" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="12" left="10"
mouse_opaque="true" name="UI Size:" v_pad="0" width="128">
UI Size:
</text>
<slider bottom="-180" can_edit_text="true"
decimal_digits="3" enabled="true" height="16" increment="0.025"
initial_val="1" left="148" max_val="1.4" min_val="0.75" mouse_opaque="true"
name="ui_scale_slider" show_text="true" value="1" width="256" />
<check_box bottom="-195" enabled="true" follows="left|top"
font="SansSerifSmall" height="16" initial_value="false"
label="Use resolution independent scale" left="151" mouse_opaque="true"
name="ui_auto_scale" radio_style="false" width="256" />
<spinner bottom="-229" decimal_digits="0" enabled="true"
follows="left|top" height="16" increment="1" initial_val="300"
label="Away Timeout:" label_width="141" left="10" max_val="600"
min_val="0" mouse_opaque="true" name="afk_timeout_spinner" width="202" />
<check_box bottom="-265" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
label="Notify when in-world currency is spent or received" left="151"
mouse_opaque="true" name="notify_money_change_checkbox" radio_style="false"
width="256" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-291" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
mouse_opaque="true" name="maturity_desired_label" v_pad="0" width="394">
Rating:
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-291" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="151"
mouse_opaque="true" name="maturity_desired_prompt" v_pad="0" width="394">
I want to access content rated:
</text>
<combo_box bottom="-297" follows="left|top" height="18" left="315"
mouse_opaque="true" name="maturity_desired_combobox" width="150" control_name="PreferredMaturity">
<combo_item name="Desired_Adult" value="42">
PG, Mature and Adult
</combo_item>
<combo_item name="Desired_Mature" value="21">
PG and Mature
</combo_item>
<combo_item name="Desired_PG" value="13">
PG only
</combo_item>
<check_box bottom_delta="-25" follows="top" height="16" initial_value="true" label="Small Avatar Names" left="101" name="small_avatar_names_checkbox"/>
<check_box bottom_delta="-18" follows="top" height="16" initial_value="false" label="Hide My Name On My Screen" name="show_my_name_checkbox"/>
<text bottom_delta="-24" follows="top" height="16" left="10" name="group_titles_textbox">Group Titles:</text>
<check_box bottom_delta="0" follows="top" height="16" initial_value="false" label="Hide All Group Titles" left="101" name="show_all_title_checkbox"/>
<check_box bottom_delta="-18" follows="top" height="16" initial_value="false" label="Hide My Group Title" left="101" name="show_my_title_checkbox"/>
<text bottom="-180" height="12" left="10" name="UI Size:">UI Size:</text>
<slider bottom="-180" can_edit_text="true" height="16" increment="0.025" initial_val="1" left="98" max_val="1.4" min_val="0.75" name="ui_scale_slider" value="1" width="227" />
<check_box bottom="-195" height="16" initial_value="false" label="Use resolution independent scale" left="101" name="ui_auto_scale"/>
<spinner bottom="-220" decimal_digits="0" height="16" increment="1" initial_val="300" label="Away Timeout:" label_width="91" left="10" max_val="600" min_val="0" name="afk_timeout_spinner" width="137"/>
<check_box bottom="-257" height="16" initial_value="false" label="Notify when in-world currency is spent or received" left="10" name="notify_money_change_checkbox"/>
<text bottom="-291" height="10" left="10" name="maturity_desired_label">Rating:</text>
<text bottom="-291" height="10" left="101" name="maturity_desired_prompt">I want to access content rated:</text>
<combo_box bottom="-297" follows="left|top" height="18" left="267" name="maturity_desired_combobox" width="120" control_name="PreferredMaturity">
<combo_item name="Desired_Adult" value="42">PG, Mature &amp; Adult</combo_item>
<combo_item name="Desired_Mature" value="21">PG &amp; Mature</combo_item>
<combo_item name="Desired_PG" value="13">PG only</combo_item>
</combo_box>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-291" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="315"
mouse_opaque="true" name="maturity_desired_textbox" v_pad="0" width="150">
PG only
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-20" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
mouse_opaque="true" name="start_location_textbox" v_pad="0" width="394">
Start Location:
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-64" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
mouse_opaque="true" name="show_names_textbox" v_pad="0" width="394">
Show Names:
</text>
<!--text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-184" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
mouse_opaque="true" name="effects_color_textbox" v_pad="0" width="394">
Color For My Effects:
</text-->
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-224" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="220"
mouse_opaque="true" name="seconds_textbox" v_pad="0" width="128">
seconds
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-331" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="18" left="10"
mouse_opaque="true" name="crash_report_textbox" v_pad="0" width="394">
Crash reports:
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-363" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="18" left="10"
mouse_opaque="true" name="language_textbox" v_pad="0" width="394">
Language:
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-1" drop_shadow_visible="true" enabled="true"
follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
height="18" left_delta="293" mouse_opaque="true" name="language_textbox2"
v_pad="0" width="400">
(Requires restart for full effect)
</text>
<combo_box allow_text_entry="true" bottom="-361" enabled="true"
follows="left|top" height="16" left="153" max_chars="135"
mouse_opaque="true" name="language_combobox" width="146">
<combo_item type="string" length="1" enabled="true" name="System Default Language" value="default">
System Default
</combo_item>
<combo_item type="string" length="1" enabled="true" name="English" value="en-us">
English
</combo_item>
<!-- After "System Default" and "English", please keep the rest of these combo_items in alphabetical order by the first character in the string. -->
<combo_item type="string" length="1" enabled="true" name="Danish" value="da">
Dansk (Danish) - Beta
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Deutsch(German)" value="de">
Deutsch (German) - Beta
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Spanish" value="es">
Español (Spanish) - Beta
</combo_item>
<combo_item type="string" length="1" enabled="true" name="French" value="fr">
Français (French) - Beta
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Italian" value="it">
Italiano (Italian) - Beta
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Hungarian" value="hu">
Magyar (Hungarian) - Beta
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Dutch" value="nl">
Nederlands (Dutch) - Beta
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Polish" value="pl">
Polski (Polish) - Beta
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Portugese" value="pt">
Portugués (Portuguese) - Beta
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Russian" value="ru">
Русский (Russian) - Beta
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Turkish" value="tr">
Türkçe (Turkish) - Beta
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Ukrainian" value="uk">
Українська (Ukrainian) - Beta
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Chinese" value="zh">
中文 (简体) (Chinese) - Beta
</combo_item>
<combo_item type="string" length="1" enabled="true" name="(Japanese)" value="ja">
日本語 (Japanese) - Beta
</combo_item>
<combo_item type="string" length="1" enabled="true" name="(Korean)" value="ko">
한국어 (Korean) - Beta
</combo_item>
<text bottom="-291" height="10" left="265" name="maturity_desired_textbox">PG only</text>
<text bottom="-20" height="10" left="10" name="start_location_textbox">Start Location:</text>
<text bottom="-64" height="10" name="show_names_textbox">Show Names:</text>
<text bottom="-214" height="10" left="150" name="seconds_textbox">seconds</text>
<text bottom="-331" height="18" left="10" name="crash_report_textbox">Crash reports:</text>
<text bottom="-363" height="18" name="language_textbox">Language:</text>
<text bottom_delta="6" follows="top" height="18" left_delta="243" name="language_textbox2">(Requires restart for full effect)
*Uses English UI</text>
<combo_box allow_text_entry="true" bottom="-361" follows="top" height="16" left="103" name="language_combobox" max_chars="32" width="140">
<combo_item name="System Default Language" value="default">System Default</combo_item>
<combo_item name="English" value="en-us">English</combo_item>
<!-- After "System Default" and "English", please keep the rest of these combo_items in alphabetical order by the first character in the string.-->
<combo_item name="French" value="fr">Français(French)</combo_item>
<!-- Also, with the above advice in mind, keep completed UI translations above this line.-->
<combo_item name="Danish" value="da">Dansk(Danish)*</combo_item>
<combo_item name="Deutsch(German)" value="de">Deutsch(German)*</combo_item>
<combo_item name="Spanish" value="es">Español(Spanish)*</combo_item>
<combo_item name="Italian" value="it">Italiano(Italian)*</combo_item>
<combo_item name="Hungarian" value="hu">Magyar(Hungarian)*</combo_item>
<combo_item name="Dutch" value="nl">Nederlands(Dutch)*</combo_item>
<combo_item name="Polish" value="pl">Polski(Polish)*</combo_item>
<combo_item name="Portugese" value="pt">Portugués(Portuguese)*</combo_item>
<combo_item name="Russian" value="ru">Русский(Russian)*</combo_item>
<combo_item name="Turkish" value="tr">Türkçe(Turkish)*</combo_item>
<combo_item name="Ukrainian" value="uk">Українська(Ukrainian)*</combo_item>
<combo_item name="Chinese" value="zh">中文(简体)(Chinese)*</combo_item>
<combo_item name="(Japanese)" value="ja">日本語(Japanese)*</combo_item>
<combo_item name="(Korean)" value="ko">한국어(Korean)*</combo_item>
</combo_box>
<string name="region_name_prompt">
&lt;Type region name&gt;
</string>
<combo_box allow_text_entry="false" bottom="-331" enabled="true" follows="left|top"
height="18" left="153" max_chars="20" mouse_opaque="true"
name="crash_behavior_combobox" width="146">
<combo_item type="string" length="1" enabled="true" name="Askbeforesending" value="Ask before sending">
Ask before sending
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Alwayssend" value="Always send">
Always send
</combo_item>
<combo_item type="string" length="1" enabled="true" name="Neversend" value="Never send">
Never send
</combo_item>
<string name="region_name_prompt">&lt;Type region name&gt;</string>
<combo_box bottom="-328" height="18" left="103" name="crash_behavior_combobox" width="115">
<combo_item name="Askbeforesending" value="Ask before sending">Ask before sending</combo_item>
<combo_item name="Alwayssend" value="Always send">Always send</combo_item>
<combo_item name="Neversend" value="Never send">Never send</combo_item>
</combo_box>
<check_box bottom="-385" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" hidden="false"
initial_value="false" label="Share language with objects" left="151"
mouse_opaque="true" name="language_is_public"
radio_style="false"
tool_tip="This lets in-world objects know your preferred language."
width="256" />
<check_box bottom="-385" height="16" initial_value="false" label="Share language with objects" left="101" name="language_is_public" tool_tip="This lets in-world objects know your preferred language."/>
</panel>

View File

@@ -36,8 +36,8 @@
<icon bottom="-89" height="14" image_name="rounded_square.tga" left_delta="44" name="UltraDivet" width="2"/>
-->
<slider bottom="-91" control_name="RenderQualityPerformance" increment="1" initial_val="0" left="165" max_val="3" min_val="0" name="QualityPerformanceSelection" show_text="false" width="150" />
<check_box bottom="-96" control_name="RenderCustomSettings" label="Custom" left="395" name="CustomSettings"/>
<view_border bevel_style="none" bottom="-395" height="280" left="5" width="485"/>
<check_box bottom="-96" control_name="RenderCustomSettings" label="Custom" left="395" initial_value="true" name="CustomSettings"/>
<view_border bevel_style="none" bottom="-395" height="280" left="5" name="GraphicsBorder" width="485"/>
<text bottom="-130" height="12" left="10" name="ShadersText">Shaders:</text>
<check_box bottom_delta="-23" control_name="RenderObjectBump" height="16" initial_value="true" label="Bump Mapping and Shiny" left="10" name="BumpShiny"/>
<check_box bottom_delta="-17" control_name="VertexShaderEnable" height="16" initial_value="true" label="Basic Shaders" left_delta="0" name="BasicShaders" tool_tip="Disabling this option may prevent some graphics card drivers from crashing."/>
@@ -59,13 +59,13 @@
<combo_item name="2" value="2">Sun and spotlight shadows</combo_item>
</combo_box>
<text bottom="-317" height="12" left="10">Avatar Rendering:</text>
<text bottom="-317" height="12" left="10" name="AvatarRenderingText">Avatar Rendering:</text>
<check_box bottom_delta="-18" control_name="RenderUseImpostors" initial_value="true" label="Avatar Impostors" left_delta="0" name="AvatarImpostors"/>
<slider bottom_delta="-12" control_name="RenderAvatarMaxVisible" decimal_digits="0" increment="1" initial_val="35" label="Max non-impostors" label_width="100" left_delta="8" max_val="50" min_val="1" name="AvatarMaxVisible" width="195"/>
<check_box bottom_delta="-22" control_name="RenderAvatarVP" initial_value="true" label="Hardware Skinning" left="10" name="AvatarVertexProgram"/>
<check_box bottom_delta="-17" control_name="RenderAvatarCloth" initial_value="true" label="Avatar Cloth" left_delta="0" name="AvatarCloth"/>
<!--text bottom="-131" height="12" left="464">m</text-->
<text bottom="-131" height="12" left="470">m</text>
<!--text bottom="-131" height="12" left="464" name="DrawDistanceMeterText1">m</text-->
<text bottom="-131" height="12" left="470" name="DrawDistanceMeterText2">m</text>
<slider bottom="-135" control_name="RenderFarClip" decimal_digits="0" height="16" increment="8" initial_val="160" label="Draw Distance:" label_width="101" left="215" max_val="1024" min_val="64" name="DrawDistance" width="262"/>
<slider bottom_delta="-16" control_name="RenderMaxPartCount" decimal_digits="0" height="16" increment="256" initial_val="4096" label="Max. Particle Count:" label_width="101" left_delta="0" max_val="8192" min_val="0" name="MaxParticleCount" width="262"/>
<slider bottom_delta="-20" control_name="RenderGlowResolutionPow" decimal_digits="0" height="16" increment="1" initial_val="8" label="Post Process Quality:" label_width="101" left_delta="0" max_val="9" min_val="8" name="RenderPostProcess" show_text="false" width="226"/>
@@ -90,7 +90,7 @@
<radio_item bottom="-15" height="16" left="3" name="SunMoon" width="156">Sun and moon only</radio_item>
<radio_item bottom="-31" height="16" left="3" name="LocalLights" width="156">Nearby local lights</radio_item>
</radio_group>
<text bottom="-354" height="12" left="370">Terrain Detail:</text>
<text bottom="-354" height="12" left="370" name="TerrainDetailText">Terrain Detail:</text>
<radio_group bottom_delta="-40" control_name="RenderTerrainDetail" draw_border="false" height="38" left_delta="0" name="TerrainDetailRadio" width="321">
<radio_item bottom="-15" height="16" left="3" name="0" width="315">Low</radio_item>
<radio_item bottom="-31" height="16" left="3" name="2" width="315">High</radio_item>

View File

@@ -1,98 +1,24 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel border="true" bottom="-409" enabled="true" follows="left|top|right|bottom"
height="408" label="Communication" left="102" mouse_opaque="true" name="im"
width="517">
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-20" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="12"
mouse_opaque="false" name="text_box" v_pad="0" width="128">
My Online Status:
</text>
<check_box bottom="-25" enabled="true" follows="left|top" font="SansSerifSmall"
height="16" initial_value="false"
label="Only my Friends and Groups can see when I am online"
left="148" mouse_opaque="true" name="online_visibility" radio_style="false"
width="350" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-40" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="12"
mouse_opaque="false" name="text_box2" v_pad="0" width="128">
IM Options:
</text>
<string name="log_in_to_change">
log in to change
</string>
<check_box bottom="-45" enabled="true" follows="left|top" font="SansSerifSmall"
height="16" initial_value="false" label="Send IM to Email ([EMAIL])"
left="148" mouse_opaque="true" name="send_im_to_email" radio_style="false"
width="350" />
<check_box bottom="-65" enabled="true" follows="left|top"
font="SansSerifSmall" height="16" initial_value="false"
label="Include IM in chat console" left="148" mouse_opaque="true"
name="include_im_in_chat_console" radio_style="false" width="237" />
<check_box bottom="-85" enabled="true" follows="left|top"
font="SansSerifSmall" height="16" initial_value="false"
label="Show timestamps in IM" left="148" mouse_opaque="true"
name="show_timestamps_check" radio_style="false" width="237" />
<check_box bottom="-105" enabled="true"
follows="left|top" font="SansSerifSmall" height="16"
initial_value="false" label="Show online Friend notifications" left="148"
mouse_opaque="true" name="friends_online_notify_checkbox"
radio_style="false" width="256" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-125" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="12"
mouse_opaque="false" name="text_box3" v_pad="0" width="128">
Busy Mode Response:
</text>
<text_editor type="string" length="1" bottom="-185" embedded_items="false" enabled="true" follows="left|top"
font="SansSerifSmall" height="70" left="148" max_length="255"
mouse_opaque="true" name="busy_response" width="330" word_wrap="true" spell_check="true" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-218" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="12"
mouse_opaque="false" name="text_box4" v_pad="0" width="128">
Logging Options:
</text>
<check_box bottom="-225" enabled="true"
follows="left|top" font="SansSerifSmall" height="16"
initial_value="false" label="Save a log of IM on my computer" left="148"
mouse_opaque="true" name="log_instant_messages" radio_style="false"
width="237" />
<check_box bottom="-245" enabled="true"
follows="left|top" font="SansSerifSmall" height="16"
initial_value="false" label="Show timestamps in IM log" left="168"
mouse_opaque="true" name="log_instant_messages_timestamp" radio_style="false"
width="217" />
<check_box bottom="-265" enabled="true" follows="left|top"
font="SansSerifSmall" height="16" initial_value="false"
label="Show the end of last IM conversation" left="168" mouse_opaque="true"
name="log_show_history" radio_style="false" width="217" />
<check_box bottom="-285" enabled="true" follows="left|top"
font="SansSerifSmall" height="16" initial_value="false" label="Save a log of Local Chat on my computer"
left="148" mouse_opaque="true" name="log_chat" radio_style="false"
width="237" />
<check_box bottom="-305" enabled="true" follows="left|top"
font="SansSerifSmall" height="16" initial_value="false"
label="Show timestamps in Local Chat log" left="168" mouse_opaque="true"
name="log_chat_timestamp" radio_style="false" width="217" />
<check_box bottom="-325" enabled="true" follows="left|top"
font="SansSerifSmall" height="16" initial_value="false"
label="Show incoming IM in Local Chat log" left="168" mouse_opaque="true"
name="log_chat_IM" radio_style="false" width="217" />
<check_box bottom="-345" enabled="true" follows="left|top"
font="SansSerifSmall" height="16" initial_value="false"
label="Include date with timestamps" left="148" mouse_opaque="true"
name="log_date_timestamp" radio_style="false" width="237" />
<check_box bottom="-365" enabled="true" follows="left|top"
font="SansSerifSmall" height="16" initial_value="false"
label="Append date to log filename" left="148" mouse_opaque="true"
name="logfile_name_datestamp" radio_style="false" width="237" />
<button bottom="-353" follows="right|bottom" font="SansSerif" halign="center"
height="20" label="Change Path" label_selected="Change Path" left="70"
mouse_opaque="true" name="log_path_button" width="90" />
<line_editor border_drop_shadow_visible="false" border_visible="false" bottom="-386"
drop_shadow_visible="true" enabled="false" follows="top|left|right"
font="SansSerifSmall" halign="right" height="19" left="148"
max_length="254" mouse_opaque="false" name="log_path_string" right="-20" />
<panel border="true" bottom="-409" height="408" label="Communication" left="102" name="im" width="517">
<text bottom="-20" left="12" name="text_box">My Online Status:</text>
<check_box bottom="-25" height="16" initial_value="false" label="Only my Friends and Groups can see when I am online" left="148" name="online_visibility"/>
<text bottom="-40" height="10" left="12" name="text_box2">IM Options:</text>
<string name="log_in_to_change">log in to change</string>
<check_box bottom="-45" height="16" initial_value="false" label="Send IM to Email ([EMAIL])" left="148" name="send_im_to_email"/>
<check_box bottom="-65" height="16" initial_value="false" label="Include IM in chat console" name="include_im_in_chat_console"/>
<check_box bottom="-85" height="16" initial_value="false" label="Show timestamps in IM" name="show_timestamps_check"/>
<check_box bottom="-105" height="16" initial_value="false" label="Show online Friend notifications" name="friends_online_notify_checkbox"/>
<text bottom="-125" height="10" left="12" name="text_box3">Busy Mode Response:</text>
<text_editor font="SansSerifSmall" bottom="-185" follows="top" height="70" left="148" max_length="255" name="busy_response" width="330" word_wrap="true" spell_check="true"/>
<text bottom="-218" height="10" left="12" name="text_box4">Logging Options:</text>
<check_box bottom="-225" height="16" initial_value="false" label="Save a log of IM on my computer" left="148" name="log_instant_messages" />
<check_box bottom="-245" height="16" initial_value="false" label="Show timestamps in IM log" left="168" name="log_instant_messages_timestamp"/>
<check_box bottom="-265" height="16" initial_value="false" label="Show the end of last IM conversation" name="log_show_history"/>
<check_box bottom="-285" height="16" initial_value="false" label="Save a log of Local Chat on my computer" left="148" name="log_chat"/>
<check_box bottom="-305" height="16" initial_value="false" label="Show timestamps in Local Chat log" left="168" name="log_chat_timestamp"/>
<check_box bottom="-325" height="16" initial_value="false" label="Show incoming IM in Local Chat log" name="log_chat_IM"/>
<check_box bottom="-345" height="16" initial_value="false" label="Include date with timestamps" left="148" name="log_date_timestamp"/>
<check_box bottom="-365" height="16" initial_value="false" label="Append date to log filename" name="logfile_name_datestamp"/>
<button bottom="-353" follows="right|bottom" height="20" label="Change Path" label_selected="Change Path" left="70" name="log_path_button" width="90" />
<line_editor border_drop_shadow_visible="false" border_visible="false" bottom="-386" drop_shadow_visible="true" follows="top|left|right" height="19" left="148" max_length="254" mouse_opaque="false" name="log_path_string" right="-20" />
</panel>

View File

@@ -1,83 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel border="true" bottom="-409" enabled="true" follows="left|top|right|bottom"
height="408" label="Input &amp; Camera" left="102" mouse_opaque="true"
name="Input panel" width="517">
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-20" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
mouse_opaque="true" name=" Mouselook Options:" v_pad="0" width="266">
Mouselook Options:
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-20" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="148"
mouse_opaque="true" name=" Mouse Sensitivity:" v_pad="0" width="128">
Mouse Sensitivity:
</text>
<slider_bar bottom="-26" enabled="true" follows="left|top"
height="16" increment="0.25" initial_val="2" left="276" max_val="15"
min_val="0" mouse_opaque="true" name="mouse_sensitivity" width="128" />
<check_box bottom_delta="-18" enabled="true" follows="left|top"
font="SansSerifSmall" height="16" label="Invert Mouse" left="148"
mouse_opaque="true" name="invert_mouse" radio_style="false" width="128" />
<check_box bottom_delta="-20" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
label="Show Avatar in Mouselook" left="148" mouse_opaque="true" name="first_person_avatar_visible"
radio_style="false" width="256" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-30" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
mouse_opaque="true" name=" Auto Fly Options:" v_pad="0" width="266">
Auto Fly Options:
</text>
<check_box bottom_delta="-6" enabled="true" follows="left|top"
font="SansSerifSmall" height="16" label="Fly/land on holding up/down"
left="148" mouse_opaque="true" name="automatic_fly" radio_style="false"
width="178" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-30" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="10"
mouse_opaque="true" name=" Camera Options:" v_pad="0" width="266">
Camera Options:
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="0" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="148"
mouse_opaque="true" name="camera_fov_label" v_pad="0" width="128">
Camera View Angle:
</text>
<slider bottom_delta="-6" can_edit_text="true"
decimal_digits="2" enabled="true" follows="left|top" width="128" height="16"
increment=".025" initial_val="1.57" left="276" max_val="2.97" min_val=".17"
mouse_opaque="true" name="camera_fov" show_text="false" value="60" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-14" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="148"
mouse_opaque="true" name="Camera Follow Distance:" v_pad="0" width="128">
Camera Follow Distance:
</text>
<slider bottom_delta="-6" can_edit_text="true" control_name="CameraOffsetScale"
decimal_digits="2" enabled="true" follows="left|top" height="16"
increment=".025" initial_val="1" left="276" min_val=".5" max_val="3"
mouse_opaque="true" name="camera_offset_scale" show_text="false" value="1"
width="128" />
<check_box bottom_delta="-24" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
label="Automatic Edit Camera Movement" left="148" mouse_opaque="true"
name="edit_camera_movement" radio_style="false"
tool_tip="Use automatic camera positioning when entering and exiting edit mode"
width="201" />
<check_box bottom_delta="-18" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
label="Automatic Appearance Camera Movement" left="148" mouse_opaque="true"
name="appearance_camera_movement" radio_style="false"
tool_tip="Use automatic camera positioning while in edit mode" width="242" />
<check_box bottom_delta="-18" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
label="Unsit Avatar on Camera Reset" left="148" mouse_opaque="true"
name="unsit_on_camera_reset" radio_style="false"
tool_tip="Stand up automatically when you press Esc and the camera switches to third person mode" width="242" />
<button bottom_delta="-30" follows="left|top" font="SansSerif" height="20"
label="Joystick Setup" left_delta="0" mouse_opaque="true"
name="joystick_setup_button" width="155" />
<panel border="true" bottom="-409" height="408" label="Input &amp; Camera" left="102" name="Input panel" width="517">
<text bottom="-20" follows="top" height="10" left="10" name=" Mouselook Options:">Mouselook Options:</text>
<text bottom="-20" follows="top" height="10" left="148" name=" Mouse Sensitivity:">Mouse Sensitivity:</text>
<slider_bar bottom="-26" follows="top" height="16" increment="0.25" initial_val="2" left="276" max_val="15" min_val="0" name="mouse_sensitivity" width="128"/>
<check_box bottom_delta="-18" follows="top" height="16" label="Invert Mouse" left="148" name="invert_mouse"/>
<check_box bottom_delta="-20" follows="top" height="16" initial_value="false" label="Show Avatar in Mouselook" name="first_person_avatar_visible"/>
<text bottom_delta="-30" follows="top" height="10" left="10" name=" Auto Fly Options:">Auto Fly Options:</text>
<check_box bottom_delta="-6" follows="top" height="16" label="Fly/land on holding up/down" left="148" name="automatic_fly"/>
<text bottom_delta="-30" follows="top" height="10" left="10" name=" Camera Options:">Camera Options:</text>
<text bottom_delta="0" follows="top" height="10" left="148" name="camera_fov_label">Camera View Angle:</text>
<slider bottom_delta="-6" can_edit_text="true" decimal_digits="2" follows="top" width="128" height="16" increment=".025" initial_val="1.57" left="276" max_val="2.97" min_val=".17" name="camera_fov" value="60"/>
<text bottom_delta="-14" follows="top" height="10" left="148" name="Camera Follow Distance:" width="128">Camera Follow Distance:</text>
<slider bottom_delta="-6" can_edit_text="true" control_name="CameraOffsetScale" decimal_digits="2" follows="top" height="16" increment=".025" initial_val="1" left="276" min_val=".5" max_val="3" name="camera_offset_scale" value="1" width="128"/>
<check_box bottom_delta="-24" follows="top" initial_value="false" label="Automatic Edit Camera Movement" left="148" name="edit_camera_movement" tool_tip="Use automatic camera positioning when entering and exiting edit mode"/>
<check_box bottom_delta="-18" follows="top" height="16" initial_value="false" label="Automatic Appearance Camera Movement" left="148" name="appearance_camera_movement" tool_tip="Use automatic camera positioning while in edit mode"/>
<check_box bottom_delta="-18" follows="top" height="16" initial_value="false" label="Unsit Avatar on Camera Reset" left="148" name="unsit_on_camera_reset" tool_tip="Stand up automatically when you press Esc and the camera switches to third person mode"/>
<button bottom_delta="-30" follows="top" font="SansSerif" height="20" label="Joystick Setup" name="joystick_setup_button" width="155"/>
</panel>

View File

@@ -1,157 +1,36 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel border="true" bottom="-409" enabled="true" follows="left|top|right|bottom"
height="408" label="Network" left="102" mouse_opaque="true" name="network"
width="517">
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-20" drop_shadow_visible="true" enabled="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="10" left="12"
mouse_opaque="false" name="text_box" v_pad="0" width="200">
Maximum Bandwidth:
</text>
<slider bottom_delta="-25" can_edit_text="true"
decimal_digits="0" enabled="true" follows="left|top" height="15"
increment="10" initial_val="50" left_delta="0" max_val="5000" min_val="50"
mouse_opaque="true" name="max_bandwidth" show_text="true" value="500"
width="180" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="4" drop_shadow_visible="true" enabled="true"
follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
height="10" left_delta="186" mouse_opaque="false" name="text_box2"
v_pad="0" width="200">
kbps (kilobits per second)
</text>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-25" drop_shadow_visible="true" enabled="true"
follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
height="10" left="12" mouse_opaque="false" name="cache_size_label_l"
v_pad="0" width="200">
Disk Cache Size (MB):
</text>
<slider bottom_delta="-25" can_edit_text="true"
decimal_digits="0" enabled="true" follows="left|top" height="15"
increment="64" initial_val="1024" left_delta="0" max_val="2048" min_val="64"
mouse_opaque="true" name="cache_size" show_text="true" width="180" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="4" drop_shadow_visible="true" enabled="true"
follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
height="10" left_delta="186" mouse_opaque="false" name="text_box5"
v_pad="0" width="40">
MB
</text>
<button bottom="-55" bottom_delta="-8" enabled="true" follows="left|top"
font="SansSerif" halign="center" height="22" label="Clear Cache" left="340"
left_delta="30" mouse_opaque="true" name="clear_cache" scale_image="true"
width="100" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-70" bottom_delta="-17" drop_shadow_visible="true" enabled="true"
follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
height="10" left="12" mouse_opaque="false" name="cache_location_label"
v_pad="0" width="200">
Disk Cache Location:
</text>
<line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-28"
enabled="false" follows="left|top" font="SansSerif"
handle_edit_keys_directly="true" height="20" left_delta="7"
max_length="4096" mouse_opaque="true" name="cache_location"
select_all_on_focus_received="false" width="470" word_wrap="false" />
<button bottom_delta="-25" enabled="true" follows="left|top" font="SansSerif"
halign="center" height="22" label="Set" label_selected="Set" left_delta="0"
mouse_opaque="true" name="set_cache" scale_image="true" width="100" />
<button bottom="-105" bottom_delta="0" enabled="true" follows="left|top"
font="SansSerif" halign="center" height="22" label="Reset"
label_selected="Set" left_delta="103" mouse_opaque="true"
name="reset_cache" scale_image="true" width="100" />
<check_box bottom="-173" bottom_delta="-35"
enabled="true" follows="left|top" font="SansSerifSmall" height="16"
initial_value="false" label="Custom Port Connection" left="12"
mouse_opaque="true" name="connection_port_enabled" radio_style="false"
width="256" />
<spinner bottom="-193" bottom_delta="-20"
decimal_digits="0" enabled="true" follows="left|top" height="16"
increment="1" initial_val="13000" label="Port Number:" label_width="75"
left_delta="20" max_val="13050" min_val="13000" mouse_opaque="true"
name="connection_port" width="150" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-24" drop_shadow_visible="true" enabled="true"
follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
height="10" left="12" mouse_opaque="false" name="socks5_auth_label"
v_pad="0" width="128">
Http Proxy:
</text>
<panel border="true" bottom="-409" height="408" label="Network" left="102" name="network" width="517">
<text bottom="-20" follows="top" height="10" left="12" name="text_box">Maximum Bandwidth:</text>
<slider bottom_delta="-25" can_edit_text="true" decimal_digits="0" follows="top" height="15" increment="10" initial_val="50" max_val="5000" min_val="50" name="max_bandwidth" show_text="true" value="500" width="180"/>
<text bottom_delta="4" follows="top" height="10" left_delta="186" name="text_box2">kbps (kilobits per second)</text>
<text bottom_delta="-25" follows="top" height="10" left="12" name="cache_size_label_l">Disk Cache Size (MB):</text>
<slider bottom_delta="-25" can_edit_text="true" decimal_digits="0" follows="top" height="15" increment="64" initial_val="1024" max_val="2048" min_val="64" name="cache_size" show_text="true" width="180"/>
<text bottom_delta="4" follows="top" height="10" left_delta="186" name="text_box5">MB</text>
<button bottom_delta="-8" follows="top" height="22" label="Clear Cache" left_delta="30" name="clear_cache" scale_image="true" width="100"/>
<text bottom_delta="-17" follows="top" height="10" left="12" name="cache_location_label">Disk Cache Location:</text>
<line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-28" follows="top" handle_edit_keys_directly="true" height="20" left_delta="7" max_length="4096" name="cache_location" width="470"/>
<button bottom_delta="-25" follows="top" height="22" label="Set" label_selected="Set" name="set_cache" scale_image="true" width="100"/>
<button bottom_delta="0" follows="top" height="22" label="Reset" label_selected="Set" left_delta="103" name="reset_cache" scale_image="true" width="100"/>
<check_box bottom_delta="-35" follows="top" height="16" initial_value="false" label="Custom Port Connection" left="12" name="connection_port_enabled"/>
<spinner bottom_delta="-20" decimal_digits="0" follows="top" height="16" increment="1" initial_val="13000" label="Port Number:" label_width="75" left_delta="20" max_val="65535" min_val="0" name="connection_port" width="150"/>
<text bottom_delta="-24" follows="top" height="10" left="12" name="socks5_auth_label">Http Proxy:</text>
<radio_group bottom_delta="-8" draw_border="false" follows="left|top" height="20" left="12"
name="socks5_http_proxy_type" width="380" >
<radio_item height="20" bottom="0" left="100" name="None" width="50"
tool_tip="No Http Proxy">
None
</radio_item>
<radio_item height="20" bottom="0" left="170" name="Socks" width="50"
tool_tip="Use Socks for Http Proxy">
Socks
</radio_item>
<radio_item height="20" bottom="0" left="250" name="Web" width="50"
tool_tip="Use web proxy for Http Proxy">
Web
</radio_item>
<radio_item height="20" bottom="0" left="100" name="None" width="50" tool_tip="No Http Proxy">None</radio_item>
<radio_item height="20" bottom="0" left="170" name="Socks" width="50" tool_tip="Use Socks for Http Proxy">Socks</radio_item>
<radio_item height="20" bottom="0" left="250" name="Web" width="50" tool_tip="Use web proxy for Http Proxy">Web</radio_item>
</radio_group>
<check_box bottom_delta="-24" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
label="Enable SOCKS 5 Proxy" left="6" mouse_opaque="true"
name="socks5_proxy_enabled" radio_style="false" width="256" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-26" drop_shadow_visible="true" enabled="true"
follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
height="10" left="12" mouse_opaque="false" name="socks5_host_label"
v_pad="0" width="128">
Socks 5 Host:
</text>
<line_editor bottom_delta="-6" enabled="true" follows="left|top" font="SansSerif"
height="20" left="90" name="socks5_proxy_host"
tool_tip="The name or IP address of the SOCKS5 proxy you would like to use"
width="200" />
<spinner bottom_delta="-30" decimal_digits="0"
enabled="true" follows="left|top" height="16" increment="1"
initial_val="80" label="Port Number:" label_width="75" left="12"
max_val="12000" min_val="10" mouse_opaque="true" name="socks5_proxy_port"
width="140" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-20" drop_shadow_visible="true" enabled="true"
follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
height="10" left="12" mouse_opaque="false" name="socks5_auth_label"
v_pad="0" width="128">
Socks5 Authentication:
</text>
<radio_group bottom_delta="-6" draw_border="false" follows="left|top" height="20" left="12"
name="socks5_auth" width="420">
<radio_item bottom="0" height="20" left_delta="80" name="None" width="50"
tool_tip="No authentication">
None
</radio_item>
<radio_item bottom="0" height="20" left_delta="50" name="UserPass" width="50"
tool_tip="Username / Password authentication">
Username/Password
</radio_item>
</radio_group>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-22" drop_shadow_visible="true" enabled="true"
follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
height="10" left="12" mouse_opaque="false" name="socks5_username_label"
v_pad="0" width="128">
Username:
</text>
<line_editor bottom_delta="-8" enabled="true" follows="left|top" font="SansSerif"
height="20" left="90" name="socks5_proxy_username"
tool_tip="Username for the Socks5 proxy"
width="200" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-20" drop_shadow_visible="true" enabled="true"
follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
height="10" left="12" mouse_opaque="false" name="socks5_password_label"
v_pad="0" width="128">
Password:
</text>
<line_editor bottom_delta="-8" enabled="true" follows="left|top" font="SansSerif"
height="20" left="90" name="socks5_proxy_password"
tool_tip="Password for the Socks5 proxy"
width="200" />
<check_box bottom_delta="-24" follows="top" height="16" initial_value="false" label="Enable SOCKS 5 Proxy" left="6" mouse_opaque="true" name="socks5_proxy_enabled" radio_style="false" width="256" />
<text bottom_delta="-26" follows="top" height="10" left="12" name="socks5_host_label">Socks 5 Host:</text>
<line_editor bottom_delta="-6" follows="top" font="SansSerif" height="20" left="90" name="socks5_proxy_host" tool_tip="The name or IP address of the SOCKS5 proxy you would like to use" width="311"/>
<spinner bottom_delta="-30" decimal_digits="0" follows="top" height="16" increment="1" initial_val="80" label="Port Number:" label_width="75" max_val="65535" min_val="0" name="socks5_proxy_port" width="140"/>
<text bottom_delta="-20" follows="top" height="10" left="12" name="socks5_auth_label">Socks5 Authentication:</text>
<radio_group bottom_delta="-6" draw_border="false" follows="top" height="20" name="socks5_auth" width="420">
<radio_item bottom="0" height="20" left_delta="80" name="None" tool_tip="No authentication">None</radio_item>
<radio_item bottom="0" height="20" left_delta="50" name="UserPass" tool_tip="Username / Password authentication">Username/Password</radio_item>
</radio_group>
<text bottom_delta="-22" follows="top" height="10" left="12" name="socks5_username_label">Username:</text>
<line_editor bottom_delta="-8" follows="top" font="SansSerif" height="20" left="90" name="socks5_proxy_username" tool_tip="Username for the Socks5 proxy" width="311"/>
<text bottom_delta="-20" follows="top" height="10" left="12" name="socks5_password_label">Password:</text>
<line_editor bottom_delta="-8" follows="top" font="SansSerif" height="20" left="90" name="socks5_proxy_password" tool_tip="Password for the Socks5 proxy" width="311"/>
</panel>

View File

@@ -1,46 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel border="true" bottom="0" height="500" label="Popups" left="0" name="popups"
title="Popups" width="400">
<text bottom="-20" follows="top|left" left="15" width="300" name="dont_show_label">
Do not show these popups:
</text>
<scroll_list follows="top|left" height="88" left="15" name="disabled_popups" width="480" />
<button follows="top|left" height="20" label="Enable this popup" left="15"
name="enable_popup" width="175" />
<button follows="top|left" height="20" label="Enable all popups..." left="200"
name="reset_dialogs_btn"
tool_tip="Enable all of the optional popups and &apos;first time use&apos; notifications."
width="175" bottom_delta="0" />
<text follows="top|left" left="15" width="128" name="show_label" bottom_delta="-24">
Show these popups:
</text>
<scroll_list follows="top|left" height="88" left="15" name="enabled_popups" width="480" />
<button follows="top|left" height="20" label="Disable first time popups..." left="15"
name="skip_frst_btn"
tool_tip="Disable all of the first time use notifications."
width="175" />
<button bottom_delta="0" follows="top|left" height="20"
label="Disable all these popups..." left="200"
name="skip_dialogs_btn"
tool_tip="Disable all of the optional popups and &apos;first time use&apos; notifications."
width="175" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-24" drop_shadow_visible="true" enabled="true"
follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
height="10" left="15" mouse_opaque="false" name="text_box2" v_pad="0"
width="270">
Offers of notecards, textures and landmarks:
</text>
<check_box bottom_delta="-25" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
label="Automatically accept" left="40" mouse_opaque="true"
name="accept_new_inventory" radio_style="false" width="270" />
<check_box bottom_delta="-20" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Automatically view after accepting" left="40" mouse_opaque="true"
name="show_new_inventory" radio_style="false" width="270" />
<check_box bottom_delta="-20" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="true"
label="Automatically show newly accepted objects in inventory" left="18" mouse_opaque="true"
name="show_in_inventory" radio_style="false" width="270" />
<panel border="true" bottom="0" height="500" label="Popups" left="0" name="popups" title="Popups" width="400">
<text bottom="-20" follows="top" left="15" name="dont_show_label">Do not show these popups:</text>
<scroll_list follows="top" height="88" name="disabled_popups" width="480"/>
<button follows="top" height="20" label="Enable this popup" name="enable_popup" width="175"/>
<button follows="top" height="20" label="Enable all popups..." left="200" name="reset_dialogs_btn" tool_tip="Enable all of the optional popups and &apos;first time use&apos; notifications." width="175" bottom_delta="0"/>
<text follows="top" left="15" name="show_label" bottom_delta="-24">Show these popups:</text>
<scroll_list follows="top" height="88" left="15" name="enabled_popups" width="480"/>
<button follows="top" height="20" label="Disable first time popups..." name="skip_frst_btn" tool_tip="Disable all of the first time use notifications." width="175"/>
<button bottom_delta="0" follows="top" height="20" label="Disable all these popups..." left="200" name="skip_dialogs_btn" tool_tip="Disable all of the optional popups and &apos;first time use&apos; notifications." width="175"/>
<text bottom_delta="-24" follows="top" height="10" left="15" name="text_box2">Offers of notecards, textures and landmarks:</text>
<check_box bottom_delta="-25" follows="top" height="16" initial_value="false" label="Automatically accept" left="40" name="accept_new_inventory"/>
<check_box bottom_delta="-20" follows="top" height="16" initial_value="true" label="Automatically view after accepting" name="show_new_inventory"/>
<check_box bottom_delta="-20" follows="top" height="16" initial_value="true" label="Automatically show newly accepted objects in inventory" left="18" name="show_in_inventory"/>
</panel>

View File

@@ -1,37 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel border="true" bottom="-409" enabled="true" follows="left|top|right|bottom"
height="408" label="Skins" left="102" mouse_opaque="true"
name="Skins panel" width="517">
<text bottom_delta="-20" follows="left|top" font="SansSerifSmall" height="16" left="200"
name="Skin_txt1" width="512">Selected Skin</text>
<combo_box allow_text_entry="false" bottom_delta="-20" left_delta="-110" follows="left|top" height="18"
max_chars="200" mouse_opaque="true" name="custom_skin_combo" width="300"
control_name="custom_skin_combo" tool_tip=""/>
<text bottom_delta="-22" follows="left|top" font="SansSerifSmall" height="16" left_delta="20"
name="Skin_txt2" width="512">Primary Author</text>
<view_border blevel_style="in" bottom_delta="-18" follows="left|top" height="16" left_delta="-0"
mouse_opaque="false" name="custom_box1" width="260"/>
<text bottom_delta="-0" follows="left|top" font="SansSerifSmall" height="16" left_delta="3"
name="custom_skin_author" width="512">skin author</text>
<text bottom_delta="-22" follows="left|top" font="SansSerifSmall" height="16" left_delta="-3"
name="Skin_txt3" width="512">Additional Authors</text>
<view_border blevel_style="in" bottom_delta="-18" follows="left|top" height="16" left_delta="-0"
mouse_opaque="false" name="custom_box2" width="260"/>
<text bottom_delta="-0" follows="left|top" font="SansSerifSmall" height="16" left_delta="3"
name="custom_skin_ad_authors" width="512">additional skin authors</text>
<text bottom_delta="-22" follows="left|top" font="SansSerifSmall" height="16" left_delta="-3"
name="Skin_txt4" width="512">Skin folder</text>
<view_border blevel_style="in" bottom_delta="-18" follows="left|top" height="16" left_delta="-0"
mouse_opaque="false" name="custom_box3" width="260"/>
<text bottom_delta="-0" follows="left|top" font="SansSerifSmall" height="16" left_delta="3"
name="custom_skin_folder" width="512">skin folder</text>
<button scale_image="true" image_selected="skin_thumbnail_default.png" image_unselected="skin_thumbnail_default.png" image_hover_selected="skin_thumbnail_default.png" image_hover_unselected="skin_thumbnail_default.png"
bottom_delta="-150" default_image_name="None" follows="left|top" label="" width="300" height="130"
left_delta="-20" mouse_opaque="true" name="custom_skin_preview" tool_tip="Skin Preview" />
<text bottom_delta="-22" follows="left|top" font="SansSerifSmall" height="16" left_delta="110"
name="Skin_txt5" width="512">Additional info</text>
<text_editor bottom_delta="-100" embedded_items="false"
enabled="false" follows="left|top" font="SansSerifSmall" height="100"
is_unicode="false" left_delta="-135" max_length="511" mouse_opaque="true"
name="custom_skin_info" width="350" word_wrap="true" />
<panel border="true" bottom="-409" height="408" label="Skins" left="102" name="Skins panel" width="517">
<text bottom_delta="-20" follows="top" height="16" left="200" name="Skin_txt1">Selected Skin</text>
<combo_box bottom_delta="-20" left_delta="-110" follows="top" height="18" max_chars="200" name="custom_skin_combo" width="300" control_name="custom_skin_combo"/>
<text bottom_delta="-22" follows="top" height="16" left_delta="20" name="Skin_txt2">Primary Author</text>
<view_border blevel_style="in" bottom_delta="-18" follows="top" height="16" name="custom_box1" width="260"/>
<text bottom_delta="-0" follows="top" height="16" left_delta="3" name="custom_skin_author">skin author</text>
<text bottom_delta="-22" follows="top" height="16" left_delta="-3" name="Skin_txt3">Additional Authors</text>
<view_border blevel_style="in" bottom_delta="-18" follows="top" height="16" name="custom_box2" width="260"/>
<text bottom_delta="-0" follows="top" height="16" left_delta="3" name="custom_skin_ad_authors">additional skin authors</text>
<text bottom_delta="-22" follows="top" height="16" left_delta="-3" name="Skin_txt4">Skin folder</text>
<view_border blevel_style="in" bottom_delta="-18" follows="top" height="16" name="custom_box3" width="260"/>
<text bottom_delta="-0" follows="top" height="16" left_delta="3" name="custom_skin_folder">skin folder</text>
<button scale_image="true" image_selected="skin_thumbnail_default.png" image_unselected="skin_thumbnail_default.png" image_hover_selected="skin_thumbnail_default.png" image_hover_unselected="skin_thumbnail_default.png" bottom_delta="-150" default_image_name="None" follows="top" width="300" height="130" left_delta="-20" label="" name="custom_skin_preview" tool_tip="Skin Preview"/>
<text bottom_delta="-22" follows="top" height="16" left_delta="110" name="Skin_txt5">Additional info</text>
<text_editor bottom_delta="-100" follows="top" height="100" left_delta="-135" max_length="511" name="custom_skin_info" width="350" word_wrap="true"/>
</panel>

View File

@@ -1,96 +1,28 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel border="true" bottom="-409" enabled="true" follows="left|top|right|bottom"
height="408" label="Voice Chat" left="102" mouse_opaque="true" name="chat"
width="517">
<text_editor type="string" length="1" allow_html="false" bg_readonly_color="0 0 0 0" bottom_delta="-26"
embedded_items="false" enabled="false" follows="left|top"
font="SansSerifSmall" height="20" hide_border="true" hide_scrollbar="true"
left_delta="8" max_length="65535" mouse_opaque="true"
name="voice_unavailable" tab_stop="false" width="450" word_wrap="true">
Voice Chat Is Not Available
</text_editor>
<check_box bottom_delta="0" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
label="Enable voice chat" left="8" mouse_opaque="true"
name="enable_voice_check" radio_style="false" width="200" />
<radio_group bottom_delta="-40" draw_border="false" follows="left|top" height="40"
left_delta="20" name="ear_location" width="364">
<radio_item type="string" length="1" bottom="-19" follows="left|top" height="16" left="3" name="0" width="315">
Hear Voice Chat from camera position.
</radio_item>
<radio_item type="string" length="1" bottom="-35" follows="left|top" height="16" left="3" name="1" width="315">
Hear Voice Chat from avatar position.
</radio_item>
<panel border="true" bottom="-409" height="408" label="Voice Chat" left="102" name="chat" width="517">
<text bottom_delta="-20" follows="left|top" left_delta="12" name="voice_unavailable">Voice Chat Is Not Available</text>
<check_box bottom_delta="0" follows="top" height="16" initial_value="false" label="Enable voice chat" left="8" name="enable_voice_check"/>
<radio_group bottom_delta="-46" draw_border="false" follows="top" height="40" left_delta="20" name="ear_location" width="364">
<radio_item bottom="-19" height="16" left="3" name="0">Hear Voice Chat from camera position.</radio_item>
<radio_item bottom="-35" height="16" name="1">Hear Voice Chat from avatar position.</radio_item>
</radio_group>
<text type="string" length="1" allow_html="false" bg_readonly_color="0 0 0 0" bottom_delta="-20"
embedded_items="false" enabled="true" follows="left|top"
font="SansSerifSmall" height="16" hide_border="true" hide_scrollbar="true"
left_delta="0" max_length="65535" mouse_opaque="true"
name="push_to_talk_heading" width="445" word_wrap="true">
Push To Talk
<text bottom_delta="-20" follows="top" height="16" name="push_to_talk_heading">Push To Talk</text>
<text bottom_delta="-77" follows="top" height="65" left_delta="20" name="voice_chat_description">
Push-to-Talk mode lets you control when your voice is transmitted. When in toggle mode,
press and release the push-to-talk trigger to switch your microphone on and off.
When not in toggle mode, the microphone is active only when the trigger is held down.
</text>
<text_editor type="string" length="1" allow_html="false" bg_readonly_color="0 0 0 0" bottom_delta="-60"
embedded_items="false" enabled="false" follows="left|top"
font="SansSerifSmall" height="65" hide_border="true" hide_scrollbar="true"
left_delta="20" max_length="65535" mouse_opaque="true"
name="voice_chat_description" tab_stop="false" width="465" word_wrap="true">
Push-to-Talk mode lets you control when your voice is transmitted. When in toggle mode, press and release the push-to-talk trigger to switch your microphone on and off. When not in toggle mode, the microphone is active only when the trigger is held down.
</text_editor>
<check_box bottom_delta="-20" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
label="Use Push-to-Talk in toggle mode" left_delta="0" mouse_opaque="true"
name="push_to_talk_toggle_check" radio_style="false" width="200" />
<text type="string" length="1" allow_html="false" bg_readonly_color="0 0 0 0" bottom_delta="-20"
embedded_items="false" enabled="true" follows="left|top"
font="SansSerifSmall" height="16" hide_border="true" hide_scrollbar="true"
left_delta="4" max_length="65535" mouse_opaque="true"
name="push_to_talk_label" width="445" word_wrap="true">
Push-to-Talk trigger:
</text>
<line_editor border_drop_shadow_visible="false" border_visible="false" bottom_delta="-20"
drop_shadow_visible="true" enabled="false"
follows="top|left" font="SansSerifSmall" halign="right" height="19"
left_delta="0" max_length="254" mouse_opaque="false" name="modifier_combo"
width="280" />
<button bottom_delta="-25" follows="left|top" font="SansSerif" halign="center"
height="20" label="Set Key" left_delta="0" mouse_opaque="true"
name="set_voice_hotkey_button" width="115" />
<button bottom_delta="0" follows="left|top" font="SansSerif" halign="center" height="20"
label="Middle Mouse Button" left_delta="120" mouse_opaque="true"
name="set_voice_middlemouse_button" width="160" />
<text allow_html="false" bg_readonly_color="0 0 0 0" bottom_delta="-25"
embedded_items="false" enabled="true" follows="left|top" height="16"
left="28" name="lip_sync_heading" width="445">
Lip Sync Mouth Animation
</text>
<check_box bottom_delta="-20" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
label="Enable lip sync animation"
left_delta="20" mouse_opaque="true" name="enable_lip_sync_check"
radio_style="false" width="200" />
<text allow_html="false" bg_readonly_color="0 0 0 0" bottom_delta="-25"
embedded_items="false" enabled="true" follows="left|top" height="16"
left="28" name="privacy_heading" width="445">
Privacy Options
</text>
<check_box bottom_delta="-20" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
label="Only accept voice calls from people on My Friends list"
left_delta="20" mouse_opaque="true" name="voice_call_friends_only_check"
radio_style="false" width="200" />
<check_box bottom_delta="-18" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
label="Switch off microphone when ending IM calls"
mouse_opaque="true" name="auto_disengage_mic_check"
radio_style="false" width="200" />
<button bottom_delta="-40" follows="left|top" font="SansSerif" height="20"
label="Device Settings" left="28" mouse_opaque="true"
name="device_settings_btn" width="155" />
<text_editor type="string" length="1" allow_html="false" bg_readonly_color="0 0 0 0" bottom_delta="-32"
embedded_items="false" enabled="false" follows="left|top"
font="SansSerifSmall" height="35" hide_border="true" hide_scrollbar="true"
left="28" max_length="65535" mouse_opaque="true"
name="device_settings_text" tab_stop="false" width="450" word_wrap="true">
NOTE: Running the Device Settings will temporarily disconnect you from Voice Chat, and changes you make will be immediately applied.
</text_editor>
<check_box bottom_delta="-20" follows="top" height="16" initial_value="false" label="Use Push-to-Talk in toggle mode" name="push_to_talk_toggle_check"/>
<text bottom_delta="-20" follows="top" height="16" left_delta="4" name="push_to_talk_label">Push-to-Talk trigger:</text>
<line_editor bottom_delta="-20" follows="top" height="19" name="modifier_combo" width="280"/>
<button bottom_delta="-25" follows="top" height="20" label="Set Key" name="set_voice_hotkey_button" width="115"/>
<button bottom_delta="0" follows="top" height="20" label="Middle Mouse Button" left_delta="120" name="set_voice_middlemouse_button" width="160"/>
<text bottom_delta="-25" follows="top" height="16" left="28" name="lip_sync_heading" width="445">Lip Sync Mouth Animation</text>
<check_box bottom_delta="-20" follows="top" height="16" initial_value="false" label="Enable lip sync animation" left_delta="20" name="enable_lip_sync_check"/>
<text bottom_delta="-25" follows="top" height="16" left="28" name="privacy_heading">Privacy Options</text>
<check_box bottom_delta="-20" follows="top" height="16" initial_value="false" label="Only accept voice calls from people on My Friends list" left_delta="20" name="voice_call_friends_only_check"/>
<check_box bottom_delta="-18" follows="top" height="16" initial_value="false" label="Switch off microphone when ending IM calls" name="auto_disengage_mic_check"/>
<button bottom_delta="-40" follows="top" height="20" label="Device Settings" left="28" mouse_opaque="true" name="device_settings_btn" width="155"/>
<text bottom_delta="-36" follows="top" height="35" left_delta="6" name="device_settings_text">NOTE: Running the Device Settings will temporarily disconnect you from Voice Chat,
and changes you make will be immediately applied.</text>
</panel>

View File

@@ -1,64 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel border="true" bottom="-409" enabled="true" follows="left|top|right|bottom"
height="408" label="Web" left="102" mouse_opaque="true" name="web"
width="517">
<radio_group bottom="-45" draw_border="false" follows="top|left" height="40" left="12"
<panel border="true" bottom="-409" height="408" label="Web" left="102" name="web" width="517">
<radio_group bottom="-45" draw_border="false" height="40" left="12"
name="use_external_browser" width="480">
<radio_item bottom="-20" height="20" left="0" name="external" width="480"
tool_tip="Use the default system web browser for help, web links, etc. Not recommended if running full screen.">
Use external web browser (Firefox, Safari, Internet Explorer)
</radio_item>
<radio_item bottom="-40" height="20" left="0" name="internal" width="480"
tool_tip="Use the built-in web browser for help, web links, etc. This browser opens as a new window inside Singularity.">
Use built-in web browser
</radio_item>
<radio_item bottom="-20" height="20" name="external" width="480" tool_tip="Use the default system web browser for help, web links, etc. Not recommended if running full screen.">Use external web browser (Firefox, Safari, Internet Explorer)</radio_item>
<radio_item bottom="-40" height="20" name="internal" width="480" tool_tip="Use the built-in web browser for help, web links, etc. This browser opens as a new window inside Singularity.">Use built-in web browser</radio_item>
</radio_group>
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-25" drop_shadow_visible="true" enabled="true"
follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
height="10" left="15" mouse_opaque="false" name="cache_size_label_l"
v_pad="0" width="128">
Browser cache:
</text>
<button bottom_delta="-10" enabled="true" follows="left|top" font="SansSerif"
halign="center" height="22" label="Clear Now" left="140"
mouse_opaque="true" name="clear_cache" scale_image="true" width="85" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-30" drop_shadow_visible="true" enabled="true"
follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
height="10" left="15" mouse_opaque="false" name="cookie_label" v_pad="0"
width="128">
Cookies:
</text>
<check_box bottom_delta="-7" enabled="true" follows="left|top"
font="SansSerifSmall" height="16" initial_value="false"
label="Accept cookies from sites" left="140" mouse_opaque="true"
name="cookies_enabled" radio_style="false" width="256" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-24" drop_shadow_visible="true" enabled="true"
follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
height="10" left="15" mouse_opaque="false" name="proxy_label" v_pad="0"
width="128">
Web Proxy:
</text>
<check_box bottom_delta="-7" enabled="true"
follows="left|top" font="SansSerifSmall" height="16" initial_value="false"
label="Enable Web Proxy" left="140" mouse_opaque="true"
name="web_proxy_enabled" radio_style="false" width="256" />
<text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-25" drop_shadow_visible="true" enabled="true"
follows="left|top" font="SansSerifSmall" h_pad="0" halign="left"
height="10" left="140" mouse_opaque="false" name="proxy_text_label"
v_pad="0" width="128">
Address:
</text>
<line_editor bottom_delta="-8" enabled="true" follows="left|top" font="SansSerif"
height="20" left="217" name="web_proxy_editor"
tool_tip="The name or IP address of the proxy you would like to use"
width="200" />
<spinner bottom_delta="-25" decimal_digits="0"
enabled="true" follows="left|top" height="16" increment="1"
initial_val="80" label="Port Number:" label_width="75" left="140"
max_val="12000" min_val="10" mouse_opaque="true" name="web_proxy_port"
width="140" />
<text bottom_delta="-25" follows="top" height="10" left="15" name="cache_size_label_l">Browser cache:</text>
<button bottom_delta="-10" follows="top" height="22" label="Clear Now" left="140" name="clear_cache" scale_image="true" width="85"/>
<text bottom_delta="-30" follows="top" height="10" left="15" name="cookie_label">Cookies:</text>
<check_box bottom_delta="-7" follows="top" height="16" initial_value="false" label="Accept cookies from sites" left="140" name="cookies_enabled"/>
<text bottom_delta="-24" follows="top" height="10" left="15" name="proxy_label">Web Proxy:</text>
<check_box bottom_delta="-7" follows="top" height="16" initial_value="false" label="Enable Web Proxy" left="140" name="web_proxy_enabled"/>
<text bottom_delta="-25" follows="top" height="10" left="30" name="proxy_text_label">Address:</text>
<line_editor bottom_delta="-8" follows="top" font="SansSerif" height="20" left="106" name="web_proxy_editor" tool_tip="The name or IP address of the proxy you would like to use" width="300"/>
<spinner bottom_delta="-25" decimal_digits="0" follows="top" height="16" increment="1" initial_val="80" label="Port Number:" label_width="75" left="30" max_val="65535" min_val="0" name="web_proxy_port" width="140"/>
</panel>

View File

@@ -4,7 +4,7 @@
height="28" name="toolbar" width="1024">
<string name="Redock Windows">Redock Windows</string>
<!-- panel bottom="0" filename="panel_bg_toolbar.xml" height="28" left="0" width="1024" /-->
<panel bottom="0" filename="panel_bg_toolbar.xml" height="28" left="0" width="1024"/>
<layout_stack name="toolbar_stack" follows="left|right|bottom|top" bottom="2" left="1" width="1022" height="26" min_width="200" min_height="26" orientation="horizontal" border_size="0">
<icon image_name="spacer24.tga" width="2" height="2" follows="left|right" auto_resize="false" color="0,0,0,0" left="0" />
<button bottom="0" font="SansSerif" height="24"

View File

@@ -208,14 +208,14 @@ class WindowsManifest(ViewerManifest):
self.path("dbghelp.dll")
# For using FMOD for sound... DJS
if self.prefix(src="../../libraries/i686-win32/lib/release", dst=""):
try:
self.path("fmod.dll")
pass
except:
print "Skipping fmod.dll - not found"
pass
self.end_prefix()
#~if self.prefix(src="../../libraries/i686-win32/lib/release", dst=""):
#~try:
#~self.path("fmod.dll")
#~pass
#~except:
#~print "Skipping fmod.dll - not found"
#~ pass
#~self.end_prefix()
# For textures
#if self.prefix(src="../../libraries/i686-win32/lib/release", dst=""):
@@ -320,6 +320,15 @@ class WindowsManifest(ViewerManifest):
self.path("wrap_oal.dll")
self.end_prefix()
if self.args['extra_libraries'] != None:
print self.args['extra_libraries']
path_list = self.args['extra_libraries'].split('|')
for path in path_list:
path_pair = path.rsplit('/', 1)
if self.prefix(src=path_pair[0], dst=""):
self.path(path_pair[1])
self.end_prefix()
# pull in the crash logger and updater from other projects
self.path(src='../win_crash_logger/%s/windows-crash-logger.exe' % self.args['configuration'], dst="win_crash_logger.exe")
self.path(src='../win_updater/%s/windows-updater.exe' % self.args['configuration'], dst="updater.exe")