Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -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=""):
|
||||
|
||||
@@ -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 = "";
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -2079,6 +2079,7 @@ LLVolume::LLVolume(const LLVolumeParams ¶ms, 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -56,7 +56,7 @@ static bool isProcessAlive(U32 pid)
|
||||
#else //Everyone Else
|
||||
|
||||
static U32 getPID() {
|
||||
return getpid()
|
||||
return getpid();
|
||||
}
|
||||
|
||||
static bool isProcessAlive(U32 pid)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)));
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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())
|
||||
{
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
208
indra/newview/llexternaleditor.cpp
Normal file
208
indra/newview/llexternaleditor.cpp
Normal 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;
|
||||
}
|
||||
105
indra/newview/llexternaleditor.h
Normal file
105
indra/newview/llexternaleditor.h
Normal 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
|
||||
@@ -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
@@ -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;
|
||||
|
||||
2555
indra/newview/llfolderviewitem.cpp
Normal file
2555
indra/newview/llfolderviewitem.cpp
Normal file
File diff suppressed because it is too large
Load Diff
541
indra/newview/llfolderviewitem.h
Normal file
541
indra/newview/llfolderviewitem.h
Normal 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
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 ));
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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="< <"
|
||||
<button bottom_delta="0" follows="right|top" height="20" label="< <"
|
||||
label_selected="> >" 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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 ***
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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="< <"
|
||||
label_selected="> >" left="143" name="toggle_active_speakers_btn"
|
||||
right="176"
|
||||
label_selected="> >" 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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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 & 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 & 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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 & 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 & 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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 & Adult</combo_item>
|
||||
<combo_item name="Desired_Mature" value="21">PG & 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">
|
||||
<Type region name>
|
||||
</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"><Type region name></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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 & 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 & 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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 'first time use' 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 'first time use' 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 'first time use' 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 'first time use' 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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user