callum 2011-03-09 15:34:43 -08:00
commit aac70bccad
172 changed files with 52423 additions and 52069 deletions

View File

@ -70,3 +70,4 @@ b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-34_2.5.0-beta3
b723921b5c711bd24dbe77dc76ef488b544dac78 2.5.0-release
b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-31_2.5.0-release
92e58e51776a4f8c29069b1a62ff21454d2085f0 2.6.0-start
63a6aedfce785a6c760377bf685b2dae616797d2 2.5.1-start

View File

@ -86,6 +86,7 @@ Aleric Inglewood
VWR-24320
VWR-24321
VWR-24354
VWR-24366
VWR-24519
SNOW-84
SNOW-477
@ -155,6 +156,7 @@ Ann Congrejo
CT-193
Ardy Lay
VWR-19499
VWR-24917
Argent Stonecutter
VWR-68
Armin Weatherwax
@ -189,6 +191,7 @@ Blakar Ogre
blino Nakamura
VWR-17
Boroondas Gupte
OPEN-29
SNOW-278
SNOW-503
SNOW-510
@ -391,10 +394,19 @@ Jonathan Yap
STORM-812
STORM-829
STORM-844
STORM-953
STORM-954
STORM-960
STORM-869
STORM-974
STORM-975
STORM-977
STORM-979
STORM-980
STORM-1040
VWR-17801
VWR-24347
STORM-975
STORM-990
Kage Pixel
VWR-11
Ken March
@ -781,6 +793,7 @@ Twisted Laws
STORM-467
STORM-844
STORM-643
STORM-954
Vadim Bigbear
VWR-2681
Vector Hastings
@ -821,6 +834,7 @@ WolfPup Lowenhar
STORM-102
STORM-103
STORM-143
STORM-236
STORM-255
STORM-256
STORM-288

View File

@ -72,9 +72,9 @@ if (VIEWER)
add_subdirectory(${LIBS_OPEN_PREFIX}media_plugins)
# llplugin testbed code (is this the right way to include it?)
if (NOT LINUX)
if (LL_TESTS AND NOT LINUX)
add_subdirectory(${VIEWER_PREFIX}test_apps/llplugintest)
endif (NOT LINUX)
endif (LL_TESTS AND NOT LINUX)
if (LINUX)
add_subdirectory(${VIEWER_PREFIX}linux_crash_logger)

View File

@ -8,9 +8,10 @@ set(GOOGLEMOCK_INCLUDE_DIRS
${LIBS_PREBUILT_DIR}/include)
if (LINUX)
# VWR-24366: gmock is underlinked, it needs gtest.
set(GOOGLEMOCK_LIBRARIES
gmock
gtest)
gmock -Wl,--no-as-needed
gtest -Wl,--as-needed)
elseif(WINDOWS)
set(GOOGLEMOCK_LIBRARIES
gmock)

View File

@ -57,11 +57,6 @@ INCLUDE(GoogleMock)
${CMAKE_SOURCE_DIR}/test/test.h
)
# Use the default flags
if (LINUX)
SET(CMAKE_EXE_LINKER_FLAGS "")
endif (LINUX)
# start the source test executable definitions
SET(${project}_TEST_OUTPUT "")
FOREACH (source ${sources})

View File

@ -1,4 +1,4 @@
#!/usr/bin/python
#!/usr/bin/env python
"""\
@file run_build_test.py
@author Nat Goodspeed

View File

@ -1,4 +1,28 @@
#!/usr/bin/env python
"""\
@file start-client.py
$LicenseInfo:firstyear=2010&license=viewerlgpl$
Second Life Viewer Source Code
Copyright (C) 2010-2011, Linden Research, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation;
version 2.1 of the License only.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
$/LicenseInfo$
"""
import sys, getopt
import os
import llstart

View File

@ -1,29 +1,30 @@
#!/usr/bin/env python
#
# @file develop.py
# @authors Bryan O'Sullivan, Mark Palange, Aaron Brashears
# @brief Fire and forget script to appropriately configure cmake for SL.
#
# $LicenseInfo:firstyear=2007&license=viewerlgpl$
# Second Life Viewer Source Code
# Copyright (C) 2010, Linden Research, Inc.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation;
# version 2.1 of the License only.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#
# Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
# $/LicenseInfo$
"""\
@file develop.py
@authors Bryan O'Sullivan, Mark Palange, Aaron Brashears
@brief Fire and forget script to appropriately configure cmake for SL.
$LicenseInfo:firstyear=2007&license=viewerlgpl$
Second Life Viewer Source Code
Copyright (C) 2007-2011, Linden Research, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation;
version 2.1 of the License only.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
$/LicenseInfo$
"""
import errno

View File

@ -1,4 +1,28 @@
#!/usr/bin/python
#!/usr/bin/env python
"""\
@file llperformance.py
$LicenseInfo:firstyear=2010&license=viewerlgpl$
Second Life Viewer Source Code
Copyright (C) 2010-2011, Linden Research, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation;
version 2.1 of the License only.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
$/LicenseInfo$
"""
# ------------------------------------------------
# Sim metrics utility functions.

View File

@ -1,7 +1,9 @@
"""@file llversion.py
@brief Utility for parsing llcommon/llversion${server}.h
for the version string and channel string
Utility that parses hg or svn info for branch and revision
#!/usr/bin/env python
"""\
@file llversion.py
@brief Parses llcommon/llversionserver.h and llcommon/llversionviewer.h
for the version string and channel string.
Parses hg info for branch and revision.
$LicenseInfo:firstyear=2006&license=mit$
@ -27,7 +29,7 @@ THE SOFTWARE.
$/LicenseInfo$
"""
import re, sys, os, commands
import re, sys, os, subprocess
# Methods for gathering version information from
# llversionviewer.h and llversionserver.h
@ -73,29 +75,13 @@ def get_viewer_channel():
def get_server_channel():
return get_channel('server')
# Methods for gathering subversion information
def get_svn_status_matching(regular_expression):
# Get the subversion info from the working source tree
status, output = commands.getstatusoutput('svn info %s' % get_src_root())
m = regular_expression.search(output)
if not m:
print >> sys.stderr, "Failed to parse svn info output, result follows:"
print >> sys.stderr, output
raise Exception, "No matching svn status in "+src_root
return m.group(1)
def get_svn_branch():
branch_re = re.compile('URL: (\S+)')
return get_svn_status_matching(branch_re)
def get_svn_revision():
last_rev_re = re.compile('Last Changed Rev: (\d+)')
return get_svn_status_matching(last_rev_re)
# Methods for gathering hg information
def get_hg_repo():
status, output = commands.getstatusoutput('hg showconfig paths.default')
child = subprocess.Popen(["hg","showconfig","paths.default"], stdout=subprocess.PIPE)
output, error = child.communicate()
status = child.returncode
if status:
print >> sys.stderr, output
print >> sys.stderr, error
sys.exit(1)
if not output:
print >> sys.stderr, 'ERROR: cannot find repo we cloned from'
@ -103,24 +89,19 @@ def get_hg_repo():
return output
def get_hg_changeset():
# The right thing to do:
# status, output = commands.getstatusoutput('hg id -i')
# if status:
# print >> sys.stderr, output
# sys.exit(1)
# The temporary hack:
status, output = commands.getstatusoutput('hg parents --template "{rev}"')
# The right thing to do would be to use the *global* revision id:
# "hg id -i"
# For the moment though, we use the parent revision:
child = subprocess.Popen(["hg","parents","--template","{rev}"], stdout=subprocess.PIPE)
output, error = child.communicate()
status = child.returncode
if status:
print >> sys.stderr, output
print >> sys.stderr, error
sys.exit(1)
lines = output.splitlines()
if len(lines) > 1:
print >> sys.stderr, 'ERROR: working directory has %d parents' % len(lines)
return lines[0]
def using_svn():
return os.path.isdir(os.path.join(get_src_root(), '.svn'))
def using_hg():
return os.path.isdir(os.path.join(get_src_root(), '.hg'))

View File

@ -1,4 +1,4 @@
#!/usr/bin/python
#!/usr/bin/env python
"""\
@file simperf_proc_interface.py
@brief Utility to extract log messages from *.<pid>.llsd files containing performance statistics.

View File

@ -1,28 +1,29 @@
#!/usr/bin/env python
# @file test_win32_manifest.py
# @brief Test an assembly binding version and uniqueness in a windows dll or exe.
#
# $LicenseInfo:firstyear=2009&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$
"""\
@file test_win32_manifest.py
@brief Test an assembly binding version and uniqueness in a windows dll or exe.
$LicenseInfo:firstyear=2009&license=viewerlgpl$
Second Life Viewer Source Code
Copyright (C) 2009-2011, Linden Research, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation;
version 2.1 of the License only.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
$/LicenseInfo$
"""
import sys, os
import tempfile
from xml.dom.minidom import parse

View File

@ -90,14 +90,16 @@ void LLAvatarName::fromLLSD(const LLSD& sd)
std::string LLAvatarName::getCompleteName() const
{
std::string name;
if (!mUsername.empty())
if (mUsername.empty() || mIsDisplayNameDefault)
// If the display name feature is off
// OR this particular display name is defaulted (i.e. based on user name),
// then display only the easier to read instance of the person's name.
{
name = mDisplayName + " (" + mUsername + ")";
name = mDisplayName;
}
else
{
// ...display names are off, legacy name is in mDisplayName
name = mDisplayName;
name = mDisplayName + " (" + mUsername + ")";
}
return name;
}

View File

@ -28,8 +28,8 @@
#define LL_LLVERSIONVIEWER_H
const S32 LL_VERSION_MAJOR = 2;
const S32 LL_VERSION_MINOR = 7;
const S32 LL_VERSION_PATCH = 0;
const S32 LL_VERSION_MINOR = 5;
const S32 LL_VERSION_PATCH = 2;
const S32 LL_VERSION_BUILD = 0;
const char * const LL_CHANNEL = "Second Life Developer";

View File

@ -72,6 +72,7 @@ static const std::string PARCEL_CATEGORY_STRING[LLParcel::C_COUNT] =
"shopping",
"stage",
"other",
"rental"
};
static const std::string PARCEL_CATEGORY_UI_STRING[LLParcel::C_COUNT + 1] =
{
@ -89,6 +90,7 @@ static const std::string PARCEL_CATEGORY_UI_STRING[LLParcel::C_COUNT + 1] =
"Shopping",
"Stage",
"Other",
"Rental",
"Any", // valid string for parcel searches
};
@ -188,8 +190,6 @@ void LLParcel::init(const LLUUID &owner_id,
mMediaID.setNull();
mMediaAutoScale = 0;
mMediaLoop = TRUE;
mObscureMedia = 1;
mObscureMusic = 1;
mMediaWidth = 0;
mMediaHeight = 0;
setMediaCurrentURL(LLStringUtil::null);
@ -685,8 +685,8 @@ void LLParcel::packMessage(LLSD& msg)
msg["auto_scale"] = getMediaAutoScale();
msg["media_loop"] = getMediaLoop();
msg["media_current_url"] = getMediaCurrentURL();
msg["obscure_media"] = getObscureMedia();
msg["obscure_music"] = getObscureMusic();
msg["obscure_media"] = false; // OBSOLETE - no longer used
msg["obscure_music"] = false; // OBSOLETE - no longer used
msg["media_id"] = getMediaID();
msg["media_allow_navigate"] = getMediaAllowNavigate();
msg["media_prevent_camera_zoom"] = getMediaPreventCameraZoom();
@ -750,16 +750,13 @@ void LLParcel::unpackMessage(LLMessageSystem* msg)
msg->getS32("MediaData", "MediaWidth", mMediaWidth);
msg->getS32("MediaData", "MediaHeight", mMediaHeight);
msg->getU8 ( "MediaData", "MediaLoop", mMediaLoop );
msg->getU8 ( "MediaData", "ObscureMedia", mObscureMedia );
msg->getU8 ( "MediaData", "ObscureMusic", mObscureMusic );
// the ObscureMedia and ObscureMusic flags previously set here are no longer used
}
else
{
setMediaType(std::string("video/vnd.secondlife.qt.legacy"));
setMediaDesc(std::string("No Description available without Server Upgrade"));
mMediaLoop = true;
mObscureMedia = true;
mObscureMusic = true;
}
if(msg->getNumberOfBlocks("MediaLinkSharing") > 0)
@ -1225,8 +1222,6 @@ void LLParcel::clearParcel()
setMediaDesc(LLStringUtil::null);
setMediaAutoScale(0);
setMediaLoop(TRUE);
mObscureMedia = 1;
mObscureMusic = 1;
mMediaWidth = 0;
mMediaHeight = 0;
setMediaCurrentURL(LLStringUtil::null);

View File

@ -165,6 +165,7 @@ public:
C_SHOPPING,
C_STAGE,
C_OTHER,
C_RENTAL,
C_COUNT,
C_ANY = -1 // only useful in queries
};
@ -238,8 +239,6 @@ public:
void setMediaID(const LLUUID& id) { mMediaID = id; }
void setMediaAutoScale ( U8 flagIn ) { mMediaAutoScale = flagIn; }
void setMediaLoop (U8 loop) { mMediaLoop = loop; }
void setObscureMedia( U8 flagIn ) { mObscureMedia = flagIn; }
void setObscureMusic( U8 flagIn ) { mObscureMusic = flagIn; }
void setMediaWidth(S32 width);
void setMediaHeight(S32 height);
void setMediaCurrentURL(const std::string& url);
@ -346,8 +345,6 @@ public:
U8 getMediaAutoScale() const { return mMediaAutoScale; }
U8 getMediaLoop() const { return mMediaLoop; }
const std::string& getMediaCurrentURL() const { return mMediaCurrentURL; }
U8 getObscureMedia() const { return mObscureMedia; }
U8 getObscureMusic() const { return mObscureMusic; }
U8 getMediaURLFilterEnable() const { return mMediaURLFilterEnable; }
LLSD getMediaURLFilterList() const { return mMediaURLFilterList; }
U8 getMediaAllowNavigate() const { return mMediaAllowNavigate; }
@ -636,8 +633,6 @@ protected:
U8 mMediaAutoScale;
U8 mMediaLoop;
std::string mMediaCurrentURL;
U8 mObscureMedia;
U8 mObscureMusic;
LLUUID mMediaID;
U8 mMediaURLFilterEnable;
LLSD mMediaURLFilterList;

View File

@ -152,7 +152,7 @@ namespace tut
void host_object::test<9>()
{
// skip("setHostByName(\"google.com\"); getHostName() -> (e.g.) \"yx-in-f100.1e100.net\"");
std::string hostStr = "linux.org";
std::string hostStr = "lindenlab.com";
LLHost host;
host.setHostByName(hostStr);

View File

@ -1,4 +1,4 @@
#!/usr/bin/python
#!/usr/bin/env python
"""\
@file test_llsdmessage_peer.py
@author Nat Goodspeed

View File

@ -1,4 +1,4 @@
#!/usr/bin/python
#!/usr/bin/env python
"""\
@file testrunner.py
@author Nat Goodspeed

View File

@ -47,6 +47,7 @@ U32 LLVertexBuffer::sSetCount = 0;
S32 LLVertexBuffer::sCount = 0;
S32 LLVertexBuffer::sGLCount = 0;
S32 LLVertexBuffer::sMappedCount = 0;
BOOL LLVertexBuffer::sDisableVBOMapping = FALSE ;
BOOL LLVertexBuffer::sEnableVBOs = TRUE;
U32 LLVertexBuffer::sGLRenderBuffer = 0;
U32 LLVertexBuffer::sGLRenderIndices = 0;
@ -251,6 +252,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(mRequestedNumIndices >= 0);
if (indices_offset >= (U32) mRequestedNumIndices ||
indices_offset + count > (U32) mRequestedNumIndices)
{
@ -282,6 +284,7 @@ void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
{
llassert(mRequestedNumVerts >= 0);
if (first >= (U32) mRequestedNumVerts ||
first + count > (U32) mRequestedNumVerts)
{
@ -305,9 +308,21 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
}
//static
void LLVertexBuffer::initClass(bool use_vbo)
void LLVertexBuffer::initClass(bool use_vbo, bool no_vbo_mapping)
{
sEnableVBOs = use_vbo;
sEnableVBOs = use_vbo && gGLManager.mHasVertexBufferObject ;
if(sEnableVBOs)
{
//llassert_always(glBindBufferARB) ; //double check the extention for VBO is loaded.
llinfos << "VBO is enabled." << llendl ;
}
else
{
llinfos << "VBO is disabled." << llendl ;
}
sDisableVBOMapping = sEnableVBOs && no_vbo_mapping ;
LLGLNamePool::registerPool(&sDynamicVBOPool);
LLGLNamePool::registerPool(&sDynamicIBOPool);
LLGLNamePool::registerPool(&sStreamVBOPool);
@ -364,7 +379,9 @@ LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) :
mGLBuffer(0),
mGLIndices(0),
mMappedData(NULL),
mMappedIndexData(NULL), mLocked(FALSE),
mMappedIndexData(NULL),
mVertexLocked(FALSE),
mIndexLocked(FALSE),
mFinal(FALSE),
mFilthy(FALSE),
mEmpty(TRUE),
@ -422,6 +439,8 @@ LLVertexBuffer::~LLVertexBuffer()
destroyGLBuffer();
destroyGLIndices();
sCount--;
llassert_always(!mMappedData && !mMappedIndexData) ;
};
//----------------------------------------------------------------------------
@ -567,6 +586,8 @@ void LLVertexBuffer::destroyGLBuffer()
{
if (useVBOs())
{
freeClientBuffer() ;
if (mMappedData || mMappedIndexData)
{
llerrs << "Vertex buffer destroyed while mapped!" << llendl;
@ -594,11 +615,13 @@ void LLVertexBuffer::destroyGLIndices()
{
if (useVBOs())
{
freeClientBuffer() ;
if (mMappedData || mMappedIndexData)
{
llerrs << "Vertex buffer destroyed while mapped." << llendl;
}
releaseIndices();
releaseIndices();
}
else
{
@ -799,6 +822,7 @@ void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices)
if (mResized && useVBOs())
{
freeClientBuffer() ;
setBuffer(0);
}
}
@ -822,36 +846,69 @@ BOOL LLVertexBuffer::useVBOs() const
}
//----------------------------------------------------------------------------
void LLVertexBuffer::freeClientBuffer()
{
if(useVBOs() && sDisableVBOMapping && (mMappedData || mMappedIndexData))
{
delete[] mMappedData ;
delete[] mMappedIndexData ;
mMappedData = NULL ;
mMappedIndexData = NULL ;
}
}
void LLVertexBuffer::allocateClientVertexBuffer()
{
if(!mMappedData)
{
U32 size = getSize() ;
mMappedData = new U8[size];
memset(mMappedData, 0, size);
}
}
void LLVertexBuffer::allocateClientIndexBuffer()
{
if(!mMappedIndexData)
{
U32 size = getIndicesSize();
mMappedIndexData = new U8[size];
memset(mMappedIndexData, 0, size);
}
}
// Map for data access
U8* LLVertexBuffer::mapBuffer(S32 access)
U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 access)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_MAP_BUFFER);
if (mFinal)
{
llerrs << "LLVertexBuffer::mapBuffer() called on a finalized buffer." << llendl;
llerrs << "LLVertexBuffer::mapVeretxBuffer() called on a finalized buffer." << llendl;
}
if (!useVBOs() && !mMappedData && !mMappedIndexData)
{
llerrs << "LLVertexBuffer::mapBuffer() called on unallocated buffer." << llendl;
llerrs << "LLVertexBuffer::mapVertexBuffer() called on unallocated buffer." << llendl;
}
if (!mLocked && useVBOs())
if (!mVertexLocked && useVBOs())
{
{
LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_VERTICES);
setBuffer(0);
mLocked = TRUE;
setBuffer(0, type);
mVertexLocked = TRUE;
stop_glerror();
mMappedData = (U8*) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
stop_glerror();
}
{
LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_INDICES);
mMappedIndexData = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
stop_glerror();
}
if(sDisableVBOMapping)
{
allocateClientVertexBuffer() ;
}
else
{
mMappedData = (U8*) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
}
stop_glerror();
}
if (!mMappedData)
{
log_glerror();
@ -862,80 +919,166 @@ U8* LLVertexBuffer::mapBuffer(S32 access)
llinfos << "Available physical mwmory(KB): " << avail_phy_mem << llendl ;
llinfos << "Available virtual memory(KB): " << avail_vir_mem << llendl;
//--------------------
//print out more debug info before crash
llinfos << "vertex buffer size: (num verts : num indices) = " << getNumVerts() << " : " << getNumIndices() << llendl ;
GLint size ;
glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_SIZE_ARB, &size) ;
llinfos << "GL_ARRAY_BUFFER_ARB size is " << size << llendl ;
//--------------------
GLint buff;
glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff);
if ((GLuint)buff != mGLBuffer)
if(!sDisableVBOMapping)
{
llerrs << "Invalid GL vertex buffer bound: " << buff << llendl;
//--------------------
//print out more debug info before crash
llinfos << "vertex buffer size: (num verts : num indices) = " << getNumVerts() << " : " << getNumIndices() << llendl ;
GLint size ;
glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_SIZE_ARB, &size) ;
llinfos << "GL_ARRAY_BUFFER_ARB size is " << size << llendl ;
//--------------------
GLint buff;
glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff);
if ((GLuint)buff != mGLBuffer)
{
llerrs << "Invalid GL vertex buffer bound: " << buff << llendl;
}
llerrs << "glMapBuffer returned NULL (no vertex data)" << llendl;
}
llerrs << "glMapBuffer returned NULL (no vertex data)" << llendl;
}
if (!mMappedIndexData)
{
log_glerror();
GLint buff;
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff);
if ((GLuint)buff != mGLIndices)
else
{
llerrs << "Invalid GL index buffer bound: " << buff << llendl;
llerrs << "memory allocation for vertex data failed." << llendl ;
}
llerrs << "glMapBuffer returned NULL (no index data)" << llendl;
}
sMappedCount++;
}
return mMappedData;
}
void LLVertexBuffer::unmapBuffer()
U8* LLVertexBuffer::mapIndexBuffer(S32 access)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_MAP_BUFFER);
if (mFinal)
{
llerrs << "LLVertexBuffer::mapIndexBuffer() called on a finalized buffer." << llendl;
}
if (!useVBOs() && !mMappedData && !mMappedIndexData)
{
llerrs << "LLVertexBuffer::mapIndexBuffer() called on unallocated buffer." << llendl;
}
if (!mIndexLocked && useVBOs())
{
{
LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_INDICES);
setBuffer(0, TYPE_INDEX);
mIndexLocked = TRUE;
stop_glerror();
if(sDisableVBOMapping)
{
allocateClientIndexBuffer() ;
}
else
{
mMappedIndexData = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
}
stop_glerror();
}
if (!mMappedIndexData)
{
log_glerror();
if(!sDisableVBOMapping)
{
GLint buff;
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff);
if ((GLuint)buff != mGLIndices)
{
llerrs << "Invalid GL index buffer bound: " << buff << llendl;
}
llerrs << "glMapBuffer returned NULL (no index data)" << llendl;
}
else
{
llerrs << "memory allocation for Index data failed. " << llendl ;
}
}
sMappedCount++;
}
return mMappedIndexData ;
}
void LLVertexBuffer::unmapBuffer(S32 type)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_UNMAP_BUFFER);
if (mMappedData || mMappedIndexData)
if (!useVBOs())
{
if (useVBOs() && mLocked)
return ; //nothing to unmap
}
bool updated_all = false ;
if (mMappedData && mVertexLocked && type != TYPE_INDEX)
{
updated_all = (mIndexLocked && type < 0) ; //both vertex and index buffers done updating
if(sDisableVBOMapping)
{
stop_glerror();
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, getSize(), mMappedData);
stop_glerror();
}
else
{
stop_glerror();
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
stop_glerror();
mMappedData = NULL;
}
mVertexLocked = FALSE ;
sMappedCount--;
}
if(mMappedIndexData && mIndexLocked && (type < 0 || type == TYPE_INDEX))
{
if(sDisableVBOMapping)
{
stop_glerror();
glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, getIndicesSize(), mMappedIndexData);
stop_glerror();
}
else
{
stop_glerror();
glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB);
stop_glerror();
/*if (!sMapped)
{
llerrs << "Redundantly unmapped VBO!" << llendl;
}
sMapped = FALSE;*/
sMappedCount--;
mMappedIndexData = NULL ;
}
if (mUsage == GL_STATIC_DRAW_ARB)
{ //static draw buffers can only be mapped a single time
//throw out client data (we won't be using it again)
mEmpty = TRUE;
mFinal = TRUE;
}
else
{
mEmpty = FALSE;
}
mIndexLocked = FALSE ;
sMappedCount--;
}
mMappedIndexData = NULL;
mMappedData = NULL;
mLocked = FALSE;
if(updated_all)
{
if(mUsage == GL_STATIC_DRAW_ARB)
{
//static draw buffers can only be mapped a single time
//throw out client data (we won't be using it again)
mEmpty = TRUE;
mFinal = TRUE;
if(sDisableVBOMapping)
{
freeClientBuffer() ;
}
}
else
{
mEmpty = FALSE;
}
}
}
@ -949,15 +1092,16 @@ template <class T,S32 type> struct VertexBufferStrider
strider_t& strider,
S32 index)
{
if (vbo.mapBuffer() == NULL)
{
llwarns << "mapBuffer failed!" << llendl;
return FALSE;
}
if (type == LLVertexBuffer::TYPE_INDEX)
{
S32 stride = sizeof(T);
if (vbo.mapIndexBuffer() == NULL)
{
llwarns << "mapIndexBuffer failed!" << llendl;
return FALSE;
}
strider = (T*)(vbo.getMappedIndices() + index*stride);
strider.setStride(0);
return TRUE;
@ -965,6 +1109,13 @@ template <class T,S32 type> struct VertexBufferStrider
else if (vbo.hasDataType(type))
{
S32 stride = vbo.getStride();
if (vbo.mapVertexBuffer(type) == NULL)
{
llwarns << "mapVertexBuffer failed!" << llendl;
return FALSE;
}
strider = (T*)(vbo.getMappedData() + vbo.getOffset(type) + index*stride);
strider.setStride(stride);
return TRUE;
@ -1045,7 +1196,7 @@ void LLVertexBuffer::setStride(S32 type, S32 new_stride)
//----------------------------------------------------------------------------
// Set for rendering
void LLVertexBuffer::setBuffer(U32 data_mask)
void LLVertexBuffer::setBuffer(U32 data_mask, S32 type)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_SET_BUFFER);
//set up pointers if the data mask is different ...
@ -1186,7 +1337,7 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
{
ll_fail("LLVertexBuffer::mapBuffer failed");
}
unmapBuffer();
unmapBuffer(type);
}
else
{

View File

@ -80,7 +80,7 @@ public:
static BOOL sUseStreamDraw;
static void initClass(bool use_vbo);
static void initClass(bool use_vbo, bool no_vbo_mapping);
static void cleanupClass();
static void setupClientArrays(U32 data_mask);
static void clientCopy(F64 max_time = 0.005); //copy data from client to GL
@ -139,19 +139,24 @@ protected:
void updateNumVerts(S32 nverts);
void updateNumIndices(S32 nindices);
virtual BOOL useVBOs() const;
void unmapBuffer();
void unmapBuffer(S32 type);
void freeClientBuffer() ;
void allocateClientVertexBuffer() ;
void allocateClientIndexBuffer() ;
public:
LLVertexBuffer(U32 typemask, S32 usage);
// map for data access
U8* mapBuffer(S32 access = -1);
U8* mapVertexBuffer(S32 type = -1, S32 access = -1);
U8* mapIndexBuffer(S32 access = -1);
// set for rendering
virtual void setBuffer(U32 data_mask); // calls setupVertexBuffer() if data_mask is not 0
virtual void setBuffer(U32 data_mask, S32 type = -1); // calls setupVertexBuffer() if data_mask is not 0
// allocate buffer
void allocateBuffer(S32 nverts, S32 nindices, bool create);
virtual void resizeBuffer(S32 newnverts, S32 newnindices);
// Only call each getVertexPointer, etc, once before calling unmapBuffer()
// call unmapBuffer() after calls to getXXXStrider() before any cals to setBuffer()
// example:
@ -170,7 +175,7 @@ public:
bool getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index=0);
BOOL isEmpty() const { return mEmpty; }
BOOL isLocked() const { return mLocked; }
BOOL isLocked() const { return mVertexLocked || mIndexLocked; }
S32 getNumVerts() const { return mNumVerts; }
S32 getNumIndices() const { return mNumIndices; }
S32 getRequestedVerts() const { return mRequestedNumVerts; }
@ -209,13 +214,14 @@ protected:
U32 mGLIndices; // GL IBO handle
U8* mMappedData; // pointer to currently mapped data (NULL if unmapped)
U8* mMappedIndexData; // pointer to currently mapped indices (NULL if unmapped)
BOOL mLocked; // if TRUE, buffer is being or has been written to in client memory
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 mFilthy; // if TRUE, entire buffer must be copied (used to prevent redundant dirty flags)
BOOL mEmpty; // if TRUE, client buffer is empty (or NULL). Old values have been discarded.
S32 mOffsets[TYPE_MAX];
BOOL mEmpty; // if TRUE, client buffer is empty (or NULL). Old values have been discarded.
BOOL mResized; // if TRUE, client buffer has been resized and GL buffer has not
BOOL mDynamicSize; // if TRUE, buffer has been resized at least once (and should be padded)
S32 mOffsets[TYPE_MAX];
class DirtyRegion
{
@ -240,13 +246,14 @@ public:
static std::vector<U32> sDeleteList;
typedef std::list<LLVertexBuffer*> buffer_list_t;
static BOOL sDisableVBOMapping; //disable glMapBufferARB
static BOOL sEnableVBOs;
static BOOL sVBOActive;
static BOOL sIBOActive;
static S32 sTypeOffsets[TYPE_MAX];
static U32 sGLMode[LLRender::NUM_MODES];
static U32 sGLRenderBuffer;
static U32 sGLRenderIndices;
static BOOL sVBOActive;
static BOOL sIBOActive;
static U32 sGLRenderIndices;
static U32 sLastMask;
static U32 sAllocatedBytes;
static U32 sBindCount;

View File

@ -316,7 +316,7 @@ void LLComboBox::setValue(const LLSD& value)
LLScrollListItem* item = mList->getFirstSelected();
if (item)
{
setLabel(getSelectedItemLabel());
updateLabel();
}
mLastSelectedIndex = mList->getFirstSelectedIndex();
}
@ -384,6 +384,23 @@ void LLComboBox::setLabel(const LLStringExplicit& name)
}
}
void LLComboBox::updateLabel()
{
// Update the combo editor with the selected
// item label.
if (mTextEntry)
{
mTextEntry->setText(getSelectedItemLabel());
mTextEntry->setTentative(FALSE);
}
// If combo box doesn't allow text entry update
// the combo button label.
if (!mAllowTextEntry)
{
mButton->setLabel(getSelectedItemLabel());
}
}
BOOL LLComboBox::remove(const std::string& name)
{
@ -701,13 +718,13 @@ void LLComboBox::onItemSelected(const LLSD& data)
mLastSelectedIndex = getCurrentIndex();
if (mLastSelectedIndex != -1)
{
setLabel(getSelectedItemLabel());
updateLabel();
if (mAllowTextEntry)
{
gFocusMgr.setKeyboardFocus(mTextEntry);
mTextEntry->selectAll();
}
{
gFocusMgr.setKeyboardFocus(mTextEntry);
mTextEntry->selectAll();
}
}
// hiding the list reasserts the old value stored in the text editor/dropdown button
hideList();

View File

@ -148,6 +148,9 @@ public:
// This is probably a UI abuse.
void setLabel(const LLStringExplicit& name);
// Updates the combobox label to match the selected list item.
void updateLabel();
BOOL remove(const std::string& name); // remove item "name", return TRUE if found and removed
BOOL setCurrentByIndex( S32 index );

View File

@ -1,359 +1,361 @@
/**
* @file lldockcontrol.cpp
* @brief Creates a panel of a specific kind for a toast
*
* $LicenseInfo:firstyear=2000&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 "linden_common.h"
#include "lldockcontrol.h"
#include "lldockablefloater.h"
LLDockControl::LLDockControl(LLView* dockWidget, LLFloater* dockableFloater,
const LLUIImagePtr& dockTongue, DocAt dockAt, get_allowed_rect_callback_t get_allowed_rect_callback) :
mDockWidget(dockWidget),
mDockableFloater(dockableFloater),
mDockTongue(dockTongue),
mDockTongueX(0),
mDockTongueY(0)
{
mDockAt = dockAt;
if (dockableFloater->isDocked())
{
on();
}
else
{
off();
}
if (!(get_allowed_rect_callback))
{
mGetAllowedRectCallback = boost::bind(&LLDockControl::getAllowedRect, this, _1);
}
else
{
mGetAllowedRectCallback = get_allowed_rect_callback;
}
if (dockWidget != NULL)
{
repositionDockable();
}
if (mDockWidget != NULL)
{
mDockWidgetVisible = isDockVisible();
}
else
{
mDockWidgetVisible = false;
}
}
LLDockControl::~LLDockControl()
{
}
void LLDockControl::setDock(LLView* dockWidget)
{
mDockWidget = dockWidget;
if (mDockWidget != NULL)
{
repositionDockable();
mDockWidgetVisible = isDockVisible();
}
else
{
mDockWidgetVisible = false;
}
}
void LLDockControl::getAllowedRect(LLRect& rect)
{
rect = mDockableFloater->getRootView()->getRect();
}
void LLDockControl::repositionDockable()
{
LLRect dockRect = mDockWidget->calcScreenRect();
LLRect rootRect;
mGetAllowedRectCallback(rootRect);
// recalculate dockable position if dock position changed, dock visibility changed,
// root view rect changed or recalculation is forced
if (mPrevDockRect != dockRect || mDockWidgetVisible != isDockVisible()
|| mRootRect != rootRect || mRecalculateDocablePosition)
{
// undock dockable and off() if dock not visible
if (!isDockVisible())
{
mDockableFloater->setDocked(false);
// force off() since dockable may not have dockControll at this time
off();
LLDockableFloater* dockable_floater =
dynamic_cast<LLDockableFloater*> (mDockableFloater);
if(dockable_floater != NULL)
{
dockable_floater->onDockHidden();
}
}
else
{
if(mEnabled)
{
moveDockable();
}
LLDockableFloater* dockable_floater =
dynamic_cast<LLDockableFloater*> (mDockableFloater);
if(dockable_floater != NULL)
{
dockable_floater->onDockShown();
}
}
mPrevDockRect = dockRect;
mRootRect = rootRect;
mRecalculateDocablePosition = false;
mDockWidgetVisible = isDockVisible();
}
}
bool LLDockControl::isDockVisible()
{
bool res = true;
if (mDockWidget != NULL)
{
//we should check all hierarchy
res = mDockWidget->isInVisibleChain();
if (res)
{
LLRect dockRect = mDockWidget->calcScreenRect();
switch (mDockAt)
{
case LEFT: // to keep compiler happy
break;
case BOTTOM:
case TOP:
{
// check is dock inside parent rect
LLRect dockParentRect =
mDockWidget->getParent()->calcScreenRect();
if (dockRect.mRight <= dockParentRect.mLeft
|| dockRect.mLeft >= dockParentRect.mRight)
{
res = false;
}
break;
}
default:
break;
}
}
}
return res;
}
void LLDockControl::moveDockable()
{
// calculate new dockable position
LLRect dockRect = mDockWidget->calcScreenRect();
LLRect rootRect;
mGetAllowedRectCallback(rootRect);
bool use_tongue = false;
LLDockableFloater* dockable_floater =
dynamic_cast<LLDockableFloater*> (mDockableFloater);
if (dockable_floater != NULL)
{
use_tongue = dockable_floater->getUseTongue();
}
LLRect dockableRect = mDockableFloater->calcScreenRect();
S32 x = 0;
S32 y = 0;
LLRect dockParentRect;
switch (mDockAt)
{
case LEFT:
x = dockRect.mLeft;
y = dockRect.mTop + mDockTongue->getHeight() + dockableRect.getHeight();
// check is dockable inside root view rect
if (x < rootRect.mLeft)
{
x = rootRect.mLeft;
}
if (x + dockableRect.getWidth() > rootRect.mRight)
{
x = rootRect.mRight - dockableRect.getWidth();
}
mDockTongueX = x + dockableRect.getWidth()/2 - mDockTongue->getWidth() / 2;
mDockTongueY = dockRect.mTop;
break;
case TOP:
x = dockRect.getCenterX() - dockableRect.getWidth() / 2;
y = dockRect.mTop + dockableRect.getHeight();
// unique docking used with dock tongue, so add tongue height to the Y coordinate
if (use_tongue)
{
y += mDockTongue->getHeight();
if ( y > rootRect.mTop)
{
y = rootRect.mTop;
}
}
// check is dockable inside root view rect
if (x < rootRect.mLeft)
{
x = rootRect.mLeft;
}
if (x + dockableRect.getWidth() > rootRect.mRight)
{
x = rootRect.mRight - dockableRect.getWidth();
}
// calculate dock tongue position
dockParentRect = mDockWidget->getParent()->calcScreenRect();
if (dockRect.getCenterX() < dockParentRect.mLeft)
{
mDockTongueX = dockParentRect.mLeft - mDockTongue->getWidth() / 2;
}
else if (dockRect.getCenterX() > dockParentRect.mRight)
{
mDockTongueX = dockParentRect.mRight - mDockTongue->getWidth() / 2;;
}
else
{
mDockTongueX = dockRect.getCenterX() - mDockTongue->getWidth() / 2;
}
mDockTongueY = dockRect.mTop;
break;
case BOTTOM:
x = dockRect.getCenterX() - dockableRect.getWidth() / 2;
y = dockRect.mBottom;
// unique docking used with dock tongue, so add tongue height to the Y coordinate
if (use_tongue)
{
y -= mDockTongue->getHeight();
}
// check is dockable inside root view rect
if (x < rootRect.mLeft)
{
x = rootRect.mLeft;
}
if (x + dockableRect.getWidth() > rootRect.mRight)
{
x = rootRect.mRight - dockableRect.getWidth();
}
// calculate dock tongue position
dockParentRect = mDockWidget->getParent()->calcScreenRect();
if (dockRect.getCenterX() < dockParentRect.mLeft)
{
mDockTongueX = dockParentRect.mLeft - mDockTongue->getWidth() / 2;
}
else if (dockRect.getCenterX() > dockParentRect.mRight)
{
mDockTongueX = dockParentRect.mRight - mDockTongue->getWidth() / 2;;
}
else
{
mDockTongueX = dockRect.getCenterX() - mDockTongue->getWidth() / 2;
}
mDockTongueY = dockRect.mBottom - mDockTongue->getHeight();
break;
}
S32 max_available_height = rootRect.getHeight() - (rootRect.mBottom - mDockTongueY) - mDockTongue->getHeight();
// A floater should be shrunk so it doesn't cover a part of its docking tongue and
// there is a space between a dockable floater and a control to which it is docked.
if (use_tongue && dockableRect.getHeight() >= max_available_height)
{
dockableRect.setLeftTopAndSize(x, y, dockableRect.getWidth(), max_available_height);
mDockableFloater->reshape(dockableRect.getWidth(), dockableRect.getHeight());
}
else
{
// move dockable
dockableRect.setLeftTopAndSize(x, y, dockableRect.getWidth(),
dockableRect.getHeight());
}
LLRect localDocableParentRect;
mDockableFloater->getParent()->screenRectToLocal(dockableRect,
&localDocableParentRect);
mDockableFloater->setRect(localDocableParentRect);
mDockableFloater->screenPointToLocal(mDockTongueX, mDockTongueY,
&mDockTongueX, &mDockTongueY);
}
void LLDockControl::on()
{
if (isDockVisible())
{
mEnabled = true;
mRecalculateDocablePosition = true;
}
}
void LLDockControl::off()
{
mEnabled = false;
}
void LLDockControl::forceRecalculatePosition()
{
mRecalculateDocablePosition = true;
}
void LLDockControl::drawToungue()
{
bool use_tongue = false;
LLDockableFloater* dockable_floater =
dynamic_cast<LLDockableFloater*> (mDockableFloater);
if (dockable_floater != NULL)
{
use_tongue = dockable_floater->getUseTongue();
}
if (mEnabled && use_tongue)
{
mDockTongue->draw(mDockTongueX, mDockTongueY);
}
}
/**
* @file lldockcontrol.cpp
* @brief Creates a panel of a specific kind for a toast
*
* $LicenseInfo:firstyear=2000&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 "linden_common.h"
#include "lldockcontrol.h"
#include "lldockablefloater.h"
LLDockControl::LLDockControl(LLView* dockWidget, LLFloater* dockableFloater,
const LLUIImagePtr& dockTongue, DocAt dockAt, get_allowed_rect_callback_t get_allowed_rect_callback) :
mDockWidget(dockWidget),
mDockableFloater(dockableFloater),
mDockTongue(dockTongue),
mDockTongueX(0),
mDockTongueY(0)
{
mDockAt = dockAt;
if (dockableFloater->isDocked())
{
on();
}
else
{
off();
}
if (!(get_allowed_rect_callback))
{
mGetAllowedRectCallback = boost::bind(&LLDockControl::getAllowedRect, this, _1);
}
else
{
mGetAllowedRectCallback = get_allowed_rect_callback;
}
if (dockWidget != NULL)
{
repositionDockable();
}
if (mDockWidget != NULL)
{
mDockWidgetVisible = isDockVisible();
}
else
{
mDockWidgetVisible = false;
}
}
LLDockControl::~LLDockControl()
{
}
void LLDockControl::setDock(LLView* dockWidget)
{
mDockWidget = dockWidget;
if (mDockWidget != NULL)
{
repositionDockable();
mDockWidgetVisible = isDockVisible();
}
else
{
mDockWidgetVisible = false;
}
}
void LLDockControl::getAllowedRect(LLRect& rect)
{
rect = mDockableFloater->getRootView()->getRect();
}
void LLDockControl::repositionDockable()
{
LLRect dockRect = mDockWidget->calcScreenRect();
LLRect rootRect;
mGetAllowedRectCallback(rootRect);
// recalculate dockable position if dock position changed, dock visibility changed,
// root view rect changed or recalculation is forced
if (mPrevDockRect != dockRect || mDockWidgetVisible != isDockVisible()
|| mRootRect != rootRect || mRecalculateDocablePosition)
{
// undock dockable and off() if dock not visible
if (!isDockVisible())
{
mDockableFloater->setDocked(false);
// force off() since dockable may not have dockControll at this time
off();
LLDockableFloater* dockable_floater =
dynamic_cast<LLDockableFloater*> (mDockableFloater);
if(dockable_floater != NULL)
{
dockable_floater->onDockHidden();
}
}
else
{
if(mEnabled)
{
moveDockable();
}
LLDockableFloater* dockable_floater =
dynamic_cast<LLDockableFloater*> (mDockableFloater);
if(dockable_floater != NULL)
{
dockable_floater->onDockShown();
}
}
mPrevDockRect = dockRect;
mRootRect = rootRect;
mRecalculateDocablePosition = false;
mDockWidgetVisible = isDockVisible();
}
}
bool LLDockControl::isDockVisible()
{
bool res = true;
if (mDockWidget != NULL)
{
//we should check all hierarchy
res = mDockWidget->isInVisibleChain();
if (res)
{
LLRect dockRect = mDockWidget->calcScreenRect();
switch (mDockAt)
{
case LEFT: // to keep compiler happy
break;
case BOTTOM:
case TOP:
{
// check is dock inside parent rect
// assume that parent for all dockable flaoters
// is the root view
LLRect dockParentRect =
mDockWidget->getRootView()->calcScreenRect();
if (dockRect.mRight <= dockParentRect.mLeft
|| dockRect.mLeft >= dockParentRect.mRight)
{
res = false;
}
break;
}
default:
break;
}
}
}
return res;
}
void LLDockControl::moveDockable()
{
// calculate new dockable position
LLRect dockRect = mDockWidget->calcScreenRect();
LLRect rootRect;
mGetAllowedRectCallback(rootRect);
bool use_tongue = false;
LLDockableFloater* dockable_floater =
dynamic_cast<LLDockableFloater*> (mDockableFloater);
if (dockable_floater != NULL)
{
use_tongue = dockable_floater->getUseTongue();
}
LLRect dockableRect = mDockableFloater->calcScreenRect();
S32 x = 0;
S32 y = 0;
LLRect dockParentRect;
switch (mDockAt)
{
case LEFT:
x = dockRect.mLeft;
y = dockRect.mTop + mDockTongue->getHeight() + dockableRect.getHeight();
// check is dockable inside root view rect
if (x < rootRect.mLeft)
{
x = rootRect.mLeft;
}
if (x + dockableRect.getWidth() > rootRect.mRight)
{
x = rootRect.mRight - dockableRect.getWidth();
}
mDockTongueX = x + dockableRect.getWidth()/2 - mDockTongue->getWidth() / 2;
mDockTongueY = dockRect.mTop;
break;
case TOP:
x = dockRect.getCenterX() - dockableRect.getWidth() / 2;
y = dockRect.mTop + dockableRect.getHeight();
// unique docking used with dock tongue, so add tongue height to the Y coordinate
if (use_tongue)
{
y += mDockTongue->getHeight();
if ( y > rootRect.mTop)
{
y = rootRect.mTop;
}
}
// check is dockable inside root view rect
if (x < rootRect.mLeft)
{
x = rootRect.mLeft;
}
if (x + dockableRect.getWidth() > rootRect.mRight)
{
x = rootRect.mRight - dockableRect.getWidth();
}
// calculate dock tongue position
dockParentRect = mDockWidget->getParent()->calcScreenRect();
if (dockRect.getCenterX() < dockParentRect.mLeft)
{
mDockTongueX = dockParentRect.mLeft - mDockTongue->getWidth() / 2;
}
else if (dockRect.getCenterX() > dockParentRect.mRight)
{
mDockTongueX = dockParentRect.mRight - mDockTongue->getWidth() / 2;;
}
else
{
mDockTongueX = dockRect.getCenterX() - mDockTongue->getWidth() / 2;
}
mDockTongueY = dockRect.mTop;
break;
case BOTTOM:
x = dockRect.getCenterX() - dockableRect.getWidth() / 2;
y = dockRect.mBottom;
// unique docking used with dock tongue, so add tongue height to the Y coordinate
if (use_tongue)
{
y -= mDockTongue->getHeight();
}
// check is dockable inside root view rect
if (x < rootRect.mLeft)
{
x = rootRect.mLeft;
}
if (x + dockableRect.getWidth() > rootRect.mRight)
{
x = rootRect.mRight - dockableRect.getWidth();
}
// calculate dock tongue position
dockParentRect = mDockWidget->getParent()->calcScreenRect();
if (dockRect.getCenterX() < dockParentRect.mLeft)
{
mDockTongueX = dockParentRect.mLeft - mDockTongue->getWidth() / 2;
}
else if (dockRect.getCenterX() > dockParentRect.mRight)
{
mDockTongueX = dockParentRect.mRight - mDockTongue->getWidth() / 2;;
}
else
{
mDockTongueX = dockRect.getCenterX() - mDockTongue->getWidth() / 2;
}
mDockTongueY = dockRect.mBottom - mDockTongue->getHeight();
break;
}
S32 max_available_height = rootRect.getHeight() - (rootRect.mBottom - mDockTongueY) - mDockTongue->getHeight();
// A floater should be shrunk so it doesn't cover a part of its docking tongue and
// there is a space between a dockable floater and a control to which it is docked.
if (use_tongue && dockableRect.getHeight() >= max_available_height)
{
dockableRect.setLeftTopAndSize(x, y, dockableRect.getWidth(), max_available_height);
mDockableFloater->reshape(dockableRect.getWidth(), dockableRect.getHeight());
}
else
{
// move dockable
dockableRect.setLeftTopAndSize(x, y, dockableRect.getWidth(),
dockableRect.getHeight());
}
LLRect localDocableParentRect;
mDockableFloater->getParent()->screenRectToLocal(dockableRect,
&localDocableParentRect);
mDockableFloater->setRect(localDocableParentRect);
mDockableFloater->screenPointToLocal(mDockTongueX, mDockTongueY,
&mDockTongueX, &mDockTongueY);
}
void LLDockControl::on()
{
if (isDockVisible())
{
mEnabled = true;
mRecalculateDocablePosition = true;
}
}
void LLDockControl::off()
{
mEnabled = false;
}
void LLDockControl::forceRecalculatePosition()
{
mRecalculateDocablePosition = true;
}
void LLDockControl::drawToungue()
{
bool use_tongue = false;
LLDockableFloater* dockable_floater =
dynamic_cast<LLDockableFloater*> (mDockableFloater);
if (dockable_floater != NULL)
{
use_tongue = dockable_floater->getUseTongue();
}
if (mEnabled && use_tongue)
{
mDockTongue->draw(mDockTongueX, mDockTongueY);
}
}

View File

@ -563,7 +563,7 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
}
// update resize bars with new limits
LLResizeBar* last_resize_bar = NULL;
LLLayoutPanel* last_resizeable_panel = NULL;
for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
{
LLPanel* panelp = (*panel_it);
@ -585,17 +585,17 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
BOOL resize_bar_enabled = panelp->getVisible() && (*panel_it)->mUserResize;
(*panel_it)->mResizeBar->setVisible(resize_bar_enabled);
if (resize_bar_enabled)
if ((*panel_it)->mUserResize || (*panel_it)->mAutoResize)
{
last_resize_bar = (*panel_it)->mResizeBar;
last_resizeable_panel = (*panel_it);
}
}
// hide last resize bar as there is nothing past it
// resize bars need to be in between two resizable panels
if (last_resize_bar)
if (last_resizeable_panel)
{
last_resize_bar->setVisible(FALSE);
last_resizeable_panel->mResizeBar->setVisible(FALSE);
}
// not enough room to fit existing contents

View File

@ -1,6 +1,6 @@
/**
* @file lldir_linux.h
* @brief Definition of directory utilities class for linux
* @brief Definition of directory utilities class for linux
*
* $LicenseInfo:firstyear=2000&license=viewerlgpl$
* Second Life Viewer Source Code
@ -24,6 +24,10 @@
* $/LicenseInfo$
*/
#if !LL_LINUX
#error This header must not be included when compiling for any target other than Linux. Consider including lldir.h instead.
#endif // !LL_LINUX
#ifndef LL_LLDIR_LINUX_H
#define LL_LLDIR_LINUX_H
@ -40,7 +44,7 @@ public:
/*virtual*/ void initAppDirs(const std::string &app_name,
const std::string& app_read_only_data_dir);
public:
virtual std::string getCurPath();
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);
virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
@ -53,7 +57,7 @@ private:
DIR *mDirp;
int mCurrentDirIndex;
int mCurrentDirCount;
std::string mCurrentDir;
std::string mCurrentDir;
};
#endif // LL_LLDIR_LINUX_H

View File

@ -24,6 +24,10 @@
* $/LicenseInfo$
*/
#if !LL_DARWIN
#error This header must not be included when compiling for any target other than Mac OS. Consider including lldir.h instead.
#endif // !LL_DARWIN
#ifndef LL_LLDIR_MAC_H
#define LL_LLDIR_MAC_H
@ -39,7 +43,7 @@ public:
/*virtual*/ void initAppDirs(const std::string &app_name,
const std::string& app_read_only_data_dir);
public:
virtual S32 deleteFilesInDir(const std::string &dirname, const std::string &mask);
virtual std::string getCurPath();
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);

View File

@ -24,6 +24,10 @@
* $/LicenseInfo$
*/
#if !LL_SOLARIS
#error This header must not be included when compiling for any target other than Solaris. Consider including lldir.h instead.
#endif // !LL_SOLARIS
#ifndef LL_LLDIR_SOLARIS_H
#define LL_LLDIR_SOLARIS_H
@ -40,7 +44,7 @@ public:
/*virtual*/ void initAppDirs(const std::string &app_name,
const std::string& app_read_only_data_dir);
public:
virtual std::string getCurPath();
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);
virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
@ -50,7 +54,7 @@ private:
DIR *mDirp;
int mCurrentDirIndex;
int mCurrentDirCount;
std::string mCurrentDir;
std::string mCurrentDir;
};
#endif // LL_LLDIR_SOLARIS_H

View File

@ -24,6 +24,10 @@
* $/LicenseInfo$
*/
#if !LL_WINDOWS
#error This header must not be included when compiling for any target other than Windows. Consider including lldir.h instead.
#endif // !LL_WINDOWS
#ifndef LL_LLDIR_WIN32_H
#define LL_LLDIR_WIN32_H
@ -47,8 +51,8 @@ public:
/*virtual*/ std::string getLLPluginFilename(std::string base_name);
private:
BOOL LLDir_Win32::getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname);
BOOL getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname);
void* mDirSearch_h;
llutf16string mCurrentDir;
};

File diff suppressed because it is too large Load Diff

View File

@ -1,29 +1,31 @@
#!/usr/bin/env python
# @file generate_breakpad_symbols.py
# @author Brad Kittenbrink <brad@lindenlab.com>
# @brief Simple tool for generating google_breakpad symbol information
# for the crash reporter.
#
# $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$
"""\
@file generate_breakpad_symbols.py
@author Brad Kittenbrink <brad@lindenlab.com>
@brief Simple tool for generating google_breakpad symbol information
for the crash reporter.
$LicenseInfo:firstyear=2010&license=viewerlgpl$
Second Life Viewer Source Code
Copyright (C) 2010-2011, Linden Research, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation;
version 2.1 of the License only.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
$/LicenseInfo$
"""
import collections

File diff suppressed because it is too large Load Diff

View File

@ -240,6 +240,9 @@ void LLAvatarList::addAvalineItem(const LLUUID& item_id, const LLUUID& session_i
LLAvalineListItem* item = new LLAvalineListItem(/*hide_number=*/false);
item->setAvatarId(item_id, session_id, true, false);
item->setName(item_name);
item->showLastInteractionTime(mShowLastInteractionTime);
item->showSpeakingIndicator(mShowSpeakingIndicator);
item->setOnline(false);
addItem(item, item_id);
mIDs.push_back(item_id);
@ -286,9 +289,18 @@ void LLAvatarList::refresh()
{
// *NOTE: If you change the UI to show a different string,
// be sure to change the filter code below.
addNewItem(buddy_id,
av_name.mDisplayName.empty() ? waiting_str : av_name.mDisplayName,
LLAvatarTracker::instance().isBuddyOnline(buddy_id));
if (LLRecentPeople::instance().isAvalineCaller(buddy_id))
{
const LLSD& call_data = LLRecentPeople::instance().getData(buddy_id);
addAvalineItem(buddy_id, call_data["session_id"].asUUID(), call_data["call_number"].asString());
}
else
{
addNewItem(buddy_id,
av_name.mDisplayName.empty() ? waiting_str : av_name.mDisplayName,
LLAvatarTracker::instance().isBuddyOnline(buddy_id));
}
modified = true;
nadded++;
}
@ -440,7 +452,7 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is
BOOL LLAvatarList::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask);
if ( mContextMenu )
if ( mContextMenu && !isAvalineItemSelected())
{
uuid_vec_t selected_uuids;
getSelectedUUIDs(selected_uuids);
@ -449,6 +461,21 @@ BOOL LLAvatarList::handleRightMouseDown(S32 x, S32 y, MASK mask)
return handled;
}
bool LLAvatarList::isAvalineItemSelected()
{
std::vector<LLPanel*> selected_items;
getSelectedItems(selected_items);
std::vector<LLPanel*>::iterator it = selected_items.begin();
for(; it != selected_items.end(); ++it)
{
if (dynamic_cast<LLAvalineListItem*>(*it))
return true;
}
return false;
}
void LLAvatarList::setVisible(BOOL visible)
{
if ( visible == FALSE && mContextMenu )

View File

@ -112,6 +112,8 @@ protected:
private:
bool isAvalineItemSelected();
bool mIgnoreOnlineStatus;
bool mShowLastInteractionTime;
bool mDirty;

File diff suppressed because it is too large Load Diff

View File

@ -116,6 +116,7 @@ public:
void showMoveButton(BOOL visible);
void showCameraButton(BOOL visible);
void showSnapshotButton(BOOL visible);
void showSpeakButton(bool visible);
void toggleMovementControls();
void toggleCameraControls();
@ -390,6 +391,13 @@ private:
*/
bool setVisibleAndFitWidths(EResizeState object_type, bool visible);
/**
* Get panel containing the given button.
*
* @see mStateProcessedObjectMap
*/
LLPanel* getButtonPanel(EResizeState button_type);
/**
* Shows/hides panel with specified well button (IM or Notification)
*
@ -409,12 +417,21 @@ private:
*/
void processChatbarCustomization(S32 new_width);
/// Get button name for debugging.
static std::string resizeStateToString(EResizeState state);
/// Buttons automatically hidden due to lack of space.
MASK mResizeState;
/**
* Mapping of button types to the layout panels the buttons are wrapped in.
*
* Used by getButtonPanel().
*/
typedef std::map<EResizeState, LLPanel*> state_object_map_t;
state_object_map_t mStateProcessedObjectMap;
/// Default (maximum) widths of the layout panels.
typedef std::map<EResizeState, S32> state_object_width_map_t;
state_object_width_map_t mObjectDefaultWidthMap;
@ -424,6 +441,7 @@ private:
* Contains order in which child buttons should be processed in show/hide, extend/shrink methods.
*/
resize_state_vec_t mButtonsProcessOrder;
/**
* Contains order in which child buttons are shown.
* It traces order of all bottomtray buttons that may change place via drag'n'drop and should
@ -451,6 +469,7 @@ protected:
LLSpeakButton* mSpeakBtn;
LLNearbyChatBar* mNearbyChatBar;
LLLayoutPanel* mChatBarContainer;
LLPanel* mNearbyCharResizeHandlePanel;
LLLayoutStack* mToolbarStack;
LLMenuGL* mBottomTrayContextMenu;
LLButton* mCamButton;

View File

@ -351,8 +351,8 @@ void LLFloaterAuction::doResetParcel()
body["media_height"] = (S32) 0;
body["auto_scale"] = (S32) 0;
body["media_loop"] = (S32) 0;
body["obscure_media"] = (S32) 0;
body["obscure_music"] = (S32) 0;
body["obscure_media"] = (S32) 0; // OBSOLETE - no longer used
body["obscure_music"] = (S32) 0; // OBSOLETE - no longer used
body["media_id"] = LLUUID::null;
body["group_id"] = MAINTENANCE_GROUP_ID; // Use maintenance group
body["pass_price"] = (S32) 10; // Defaults to $10

View File

@ -220,6 +220,8 @@ BOOL LLFloaterTools::postBuild()
mRadioGroupEdit = getChild<LLRadioGroup>("edit_radio_group");
mBtnGridOptions = getChild<LLButton>("Options...");
mTitleMedia = getChild<LLMediaCtrl>("title_media");
mBtnLink = getChild<LLButton>("link_btn");
mBtnUnlink = getChild<LLButton>("unlink_btn");
mCheckSelectIndividual = getChild<LLCheckBoxCtrl>("checkbox edit linked parts");
getChild<LLUICtrl>("checkbox edit linked parts")->setValue((BOOL)gSavedSettings.getBOOL("EditLinkedParts"));
@ -315,6 +317,9 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
mBtnRotateReset(NULL),
mBtnRotateRight(NULL),
mBtnLink(NULL),
mBtnUnlink(NULL),
mBtnDelete(NULL),
mBtnDuplicate(NULL),
mBtnDuplicateInPlace(NULL),
@ -341,7 +346,7 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
mNeedMediaTitle(TRUE)
{
gFloaterTools = this;
setAutoFocus(FALSE);
mFactoryMap["General"] = LLCallbackMap(createPanelPermissions, this);//LLPanelPermissions
mFactoryMap["Object"] = LLCallbackMap(createPanelObject, this);//LLPanelObject
@ -366,6 +371,9 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
mCommitCallbackRegistrar.add("BuildTool.DeleteMedia", boost::bind(&LLFloaterTools::onClickBtnDeleteMedia,this));
mCommitCallbackRegistrar.add("BuildTool.EditMedia", boost::bind(&LLFloaterTools::onClickBtnEditMedia,this));
mCommitCallbackRegistrar.add("BuildTool.LinkObjects", boost::bind(&LLSelectMgr::linkObjects, LLSelectMgr::getInstance()));
mCommitCallbackRegistrar.add("BuildTool.UnlinkObjects", boost::bind(&LLSelectMgr::unlinkObjects, LLSelectMgr::getInstance()));
}
LLFloaterTools::~LLFloaterTools()
@ -566,6 +574,12 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
bool linked_parts = gSavedSettings.getBOOL("EditLinkedParts");
getChildView("RenderingCost")->setVisible( !linked_parts && (edit_visible || focus_visible || move_visible) && sShowObjectCost);
mBtnLink->setVisible(edit_visible);
mBtnUnlink->setVisible(edit_visible);
mBtnLink->setEnabled(LLSelectMgr::instance().enableLinkObjects());
mBtnUnlink->setEnabled(LLSelectMgr::instance().enableUnlinkObjects());
if (mCheckSelectIndividual)
{
mCheckSelectIndividual->setVisible(edit_visible);

View File

@ -135,6 +135,8 @@ public:
LLRadioGroup* mRadioGroupEdit;
LLCheckBoxCtrl *mCheckSelectIndividual;
LLButton* mBtnLink;
LLButton* mBtnUnlink;
LLCheckBoxCtrl* mCheckSnapToGrid;
LLButton* mBtnGridOptions;

View File

@ -28,6 +28,7 @@
#include "llfriendcard.h"
#include "llagent.h"
#include "llavatarnamecache.h"
#include "llinventory.h"
#include "llinventoryfunctions.h"
@ -290,58 +291,6 @@ void LLFriendCardsManager::syncFriendCardsFolders()
boost::bind(&LLFriendCardsManager::ensureFriendsFolderExists, this));
}
void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const
{
folderBuddiesMap.clear();
static bool syncronize_friends_folders = true;
if (syncronize_friends_folders)
{
// Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" folder,
// fetches their contents if needed and synchronizes it with buddies list.
// If the folders are not found they are created.
LLFriendCardsManager::instance().syncFriendCardsFolders();
syncronize_friends_folders = false;
}
LLInventoryModel::cat_array_t* listFolders;
LLInventoryModel::item_array_t* items;
// get folders in the Friend folder. Items should be NULL due to Cards should be in lists.
gInventory.getDirectDescendentsOf(findFriendFolderUUIDImpl(), listFolders, items);
if (NULL == listFolders)
return;
LLInventoryModel::cat_array_t::const_iterator itCats; // to iterate Friend Lists (categories)
LLInventoryModel::item_array_t::const_iterator itBuddy; // to iterate Buddies in each List
LLInventoryModel::cat_array_t* fakeCatsArg;
for (itCats = listFolders->begin(); itCats != listFolders->end(); ++itCats)
{
if (items)
items->clear();
// *HACK: Only Friends/All content will be shown for now
// *TODO: Remove this hack, implement sorting if it will be needded by spec.
if ((*itCats)->getUUID() != findFriendAllSubfolderUUIDImpl())
continue;
gInventory.getDirectDescendentsOf((*itCats)->getUUID(), fakeCatsArg, items);
if (NULL == items)
continue;
uuid_vec_t buddyUUIDs;
for (itBuddy = items->begin(); itBuddy != items->end(); ++itBuddy)
{
buddyUUIDs.push_back((*itBuddy)->getCreatorUUID());
}
folderBuddiesMap.insert(make_pair((*itCats)->getUUID(), buddyUUIDs));
}
}
/************************************************************************/
/* Private Methods */
@ -499,23 +448,43 @@ void LLFriendCardsManager::syncFriendsFolder()
LLAvatarTracker::buddy_map_t all_buddies;
LLAvatarTracker::instance().copyBuddyList(all_buddies);
// 1. Remove Friend Cards for non-friends
// 1. Check if own calling card exists
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
gInventory.collectDescendents(findFriendAllSubfolderUUIDImpl(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
LLUUID friends_all_folder_id = findFriendAllSubfolderUUIDImpl();
gInventory.collectDescendents(friends_all_folder_id, cats, items, LLInventoryModel::EXCLUDE_TRASH);
bool own_callingcard_found = false;
LLInventoryModel::item_array_t::const_iterator it;
for (it = items.begin(); it != items.end(); ++it)
{
lldebugs << "Check if buddy is in list: " << (*it)->getName() << " " << (*it)->getCreatorUUID() << llendl;
if (NULL == get_ptr_in_map(all_buddies, (*it)->getCreatorUUID()))
if ((*it)->getCreatorUUID() == gAgentID)
{
lldebugs << "NONEXISTS, so remove it" << llendl;
removeFriendCardFromInventory((*it)->getCreatorUUID());
own_callingcard_found = true;
break;
}
}
// Create own calling card if it was not found in Friends/All folder
if (!own_callingcard_found)
{
LLAvatarName av_name;
LLAvatarNameCache::get( gAgentID, &av_name );
create_inventory_item(gAgentID,
gAgent.getSessionID(),
friends_all_folder_id,
LLTransactionID::tnull,
av_name.getCompleteName(),
gAgentID.asString(),
LLAssetType::AT_CALLINGCARD,
LLInventoryType::IT_CALLINGCARD,
NOT_WEARABLE,
PERM_MOVE | PERM_TRANSFER,
NULL);
}
// 2. Add missing Friend Cards for friends
LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
llinfos << "try to build friends, count: " << all_buddies.size() << llendl;

View File

@ -79,19 +79,6 @@ public:
*/
void syncFriendCardsFolders();
/*!
* \brief
* Collects folders' IDs with the buddies' IDs in the Inventory Calling Card/Friends folder.
*
* \param folderBuddiesMap
* map into collected data will be put. It will be cleared before adding new data.
*
* Each item in the out map is a pair where first is an LLViewerInventoryCategory UUID,
* second is a vector with UUID of Avatars from this folder.
*
*/
void collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const;
private:
typedef boost::function<void()> callback_t;

View File

@ -483,9 +483,6 @@ bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(const LLInventoryIte
switch(item->getType())
{
case LLAssetType::AT_CALLINGCARD:
return false;
break;
case LLAssetType::AT_OBJECT:
case LLAssetType::AT_BODYPART:
case LLAssetType::AT_CLOTHING:

View File

@ -373,17 +373,19 @@ BOOL LLMuteList::remove(const LLMute& mute, U32 flags)
// Must be after erase.
setLoaded(); // why is this here? -MG
}
// Clean up any legacy mutes
string_set_t::iterator legacy_it = mLegacyMutes.find(mute.mName);
if (legacy_it != mLegacyMutes.end())
else
{
// Database representation of legacy mute is UUID null.
LLMute mute(LLUUID::null, *legacy_it, LLMute::BY_NAME);
updateRemove(mute);
mLegacyMutes.erase(legacy_it);
// Must be after erase.
setLoaded(); // why is this here? -MG
// Clean up any legacy mutes
string_set_t::iterator legacy_it = mLegacyMutes.find(mute.mName);
if (legacy_it != mLegacyMutes.end())
{
// Database representation of legacy mute is UUID null.
LLMute mute(LLUUID::null, *legacy_it, LLMute::BY_NAME);
updateRemove(mute);
mLegacyMutes.erase(legacy_it);
// Must be after erase.
setLoaded(); // why is this here? -MG
}
}
return found;
@ -607,7 +609,8 @@ BOOL LLMuteList::isMuted(const LLUUID& id, const std::string& name, U32 flags) c
}
// empty names can't be legacy-muted
if (name.empty()) return FALSE;
bool avatar = mute_object && mute_object->isAvatar();
if (name.empty() || avatar) return FALSE;
// Look in legacy pile
string_set_t::const_iterator legacy_it = mLegacyMutes.find(name);

View File

@ -91,9 +91,6 @@ BOOL LLPanelLandAudio::postBuild()
mMusicURLEdit = getChild<LLLineEditor>("music_url");
childSetCommitCallback("music_url", onCommitAny, this);
mMusicUrlCheck = getChild<LLCheckBoxCtrl>("hide_music_url");
childSetCommitCallback("hide_music_url", onCommitAny, this);
return TRUE;
}
@ -117,9 +114,6 @@ void LLPanelLandAudio::refresh()
mCheckSoundLocal->set( parcel->getSoundLocal() );
mCheckSoundLocal->setEnabled( can_change_media );
mMusicUrlCheck->set( parcel->getObscureMusic() );
mMusicUrlCheck->setEnabled( can_change_media );
bool allow_voice = parcel->getParcelFlagAllowVoice();
LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
@ -148,13 +142,6 @@ void LLPanelLandAudio::refresh()
mCheckParcelEnableVoice->set(allow_voice);
mCheckParcelVoiceLocal->set(!parcel->getParcelFlagUseEstateVoiceChannel());
// don't display urls if you're not able to change it
// much requested change in forums so people can't 'steal' urls
// NOTE: bug#2009 means this is still vunerable - however, bug
// should be closed since this bug opens up major security issues elsewhere.
bool obscure_music = ! can_change_media && parcel->getObscureMusic();
mMusicURLEdit->setDrawAsterixes(obscure_music);
mMusicURLEdit->setText(parcel->getMusicURL());
mMusicURLEdit->setEnabled( can_change_media );
}
@ -173,7 +160,6 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
// Extract data from UI
BOOL sound_local = self->mCheckSoundLocal->get();
std::string music_url = self->mMusicURLEdit->getText();
U8 obscure_music = self->mMusicUrlCheck->get();
BOOL voice_enabled = self->mCheckParcelEnableVoice->get();
BOOL voice_estate_chan = !self->mCheckParcelVoiceLocal->get();
@ -186,7 +172,6 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
parcel->setParcelFlag(PF_USE_ESTATE_VOICE_CHAN, voice_estate_chan);
parcel->setParcelFlag(PF_SOUND_LOCAL, sound_local);
parcel->setMusicURL(music_url);
parcel->setObscureMusic(obscure_music);
// Send current parcel data upstream to server
LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );

View File

@ -68,8 +68,7 @@ LLPanelLandMedia::LLPanelLandMedia(LLParcelSelectionHandle& parcel)
mMediaSizeCtrlLabel(NULL),
mMediaTextureCtrl(NULL),
mMediaAutoScaleCheck(NULL),
mMediaLoopCheck(NULL),
mMediaUrlCheck(NULL)
mMediaLoopCheck(NULL)
{
}
@ -94,9 +93,6 @@ BOOL LLPanelLandMedia::postBuild()
mMediaLoopCheck = getChild<LLCheckBoxCtrl>("media_loop");
childSetCommitCallback("media_loop", onCommitAny, this );
mMediaUrlCheck = getChild<LLCheckBoxCtrl>("hide_media_url");
childSetCommitCallback("hide_media_url", onCommitAny, this );
mMediaURLEdit = getChild<LLLineEditor>("media_url");
childSetCommitCallback("media_url", onCommitAny, this );
@ -153,25 +149,6 @@ void LLPanelLandMedia::refresh()
mMediaTypeCombo->setEnabled( can_change_media );
getChild<LLUICtrl>("mime_type")->setValue(mime_type);
mMediaUrlCheck->set( parcel->getObscureMedia() );
mMediaUrlCheck->setEnabled( can_change_media );
// don't display urls if you're not able to change it
// much requested change in forums so people can't 'steal' urls
// NOTE: bug#2009 means this is still vunerable - however, bug
// should be closed since this bug opens up major security issues elsewhere.
bool obscure_media = ! can_change_media && parcel->getObscureMedia();
// Special code to disable asterixes for html type
if(mime_type == "text/html")
{
obscure_media = false;
mMediaUrlCheck->set( 0 );
mMediaUrlCheck->setEnabled( false );
}
mMediaURLEdit->setDrawAsterixes( obscure_media );
mMediaAutoScaleCheck->set( parcel->getMediaAutoScale () );
mMediaAutoScaleCheck->setEnabled ( can_change_media );
@ -301,7 +278,6 @@ void LLPanelLandMedia::onCommitAny(LLUICtrl*, void *userdata)
std::string mime_type = self->getChild<LLUICtrl>("mime_type")->getValue().asString();
U8 media_auto_scale = self->mMediaAutoScaleCheck->get();
U8 media_loop = self->mMediaLoopCheck->get();
U8 obscure_media = self->mMediaUrlCheck->get();
S32 media_width = (S32)self->mMediaWidthCtrl->get();
S32 media_height = (S32)self->mMediaHeightCtrl->get();
LLUUID media_id = self->mMediaTextureCtrl->getImageAssetID();
@ -321,7 +297,6 @@ void LLPanelLandMedia::onCommitAny(LLUICtrl*, void *userdata)
parcel->setMediaID(media_id);
parcel->setMediaAutoScale ( media_auto_scale );
parcel->setMediaLoop ( media_loop );
parcel->setObscureMedia( obscure_media );
// Send current parcel data upstream to server
LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );

File diff suppressed because it is too large Load Diff

View File

@ -564,16 +564,14 @@ void LLPanelNearByMedia::refreshParcelItems()
if (NULL != mParcelMediaItem)
{
std::string name, url, tooltip;
if (!LLViewerParcelMgr::getInstance()->getAgentParcel()->getObscureMedia())
getNameAndUrlHelper(LLViewerParcelMedia::getParcelMedia(), name, url, "");
if (name.empty() || name == url)
{
getNameAndUrlHelper(LLViewerParcelMedia::getParcelMedia(), name, url, "");
if (name.empty() || name == url)
{
tooltip = url;
}
else {
tooltip = name + " : " + url;
}
tooltip = url;
}
else
{
tooltip = name + " : " + url;
}
LLViewerMediaImpl *impl = LLViewerParcelMedia::getParcelMedia();
updateListItem(mParcelMediaItem,
@ -611,10 +609,8 @@ void LLPanelNearByMedia::refreshParcelItems()
bool is_playing = LLViewerMedia::isParcelAudioPlaying();
std::string url;
if (!LLViewerParcelMgr::getInstance()->getAgentParcel()->getObscureMusic())
{
url = LLViewerMedia::getParcelAudioURL();
}
url = LLViewerMedia::getParcelAudioURL();
updateListItem(mParcelAudioItem,
mParcelAudioName,
url,

View File

@ -384,6 +384,16 @@ private:
{
lldebugs << "Inventory changed: " << mask << llendl;
static bool synchronize_friends_folders = true;
if (synchronize_friends_folders)
{
// Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" folder,
// fetches their contents if needed and synchronizes it with buddies list.
// If the folders are not found they are created.
LLFriendCardsManager::instance().syncFriendCardsFolders();
synchronize_friends_folders = false;
}
// *NOTE: deleting of InventoryItem is performed via moving to Trash.
// That means LLInventoryObserver::STRUCTURE is present in MASK instead of LLInventoryObserver::REMOVE
if ((CALLINGCARD_ADDED & mask) == CALLINGCARD_ADDED)
@ -750,18 +760,23 @@ void LLPanelPeople::updateFriendList()
all_friendsp.clear();
online_friendsp.clear();
LLFriendCardsManager::folderid_buddies_map_t listMap;
uuid_vec_t buddies_uuids;
LLAvatarTracker::buddy_map_t::const_iterator buddies_iter;
// *NOTE: For now collectFriendsLists returns data only for Friends/All folder. EXT-694.
LLFriendCardsManager::instance().collectFriendsLists(listMap);
if (listMap.size() > 0)
// Fill the avatar list with friends UUIDs
for (buddies_iter = all_buddies.begin(); buddies_iter != all_buddies.end(); ++buddies_iter)
{
lldebugs << "Friends Cards were found, count: " << listMap.begin()->second.size() << llendl;
all_friendsp = listMap.begin()->second;
buddies_uuids.push_back(buddies_iter->first);
}
if (buddies_uuids.size() > 0)
{
lldebugs << "Friends added to the list: " << buddies_uuids.size() << llendl;
all_friendsp = buddies_uuids;
}
else
{
lldebugs << "Friends Cards were not found" << llendl;
lldebugs << "No friends found" << llendl;
}
LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();

View File

@ -33,7 +33,7 @@
using namespace LLOldEvents;
bool LLRecentPeople::add(const LLUUID& id)
bool LLRecentPeople::add(const LLUUID& id, const LLSD& userdata)
{
if (id == gAgent.getID())
return false;
@ -42,10 +42,16 @@ bool LLRecentPeople::add(const LLUUID& id)
if (is_not_group_id)
{
LLDate date_added = LLDate::now();
// For each avaline call the id of caller is different even if
// the phone number is the same.
// To avoid duplication of avaline list items in the recent list
// of panel People, deleting id's with similar phone number.
const LLUUID& caller_id = getIDByPhoneNumber(userdata);
if (caller_id.notNull())
mPeople.erase(caller_id);
//[] instead of insert to replace existing id->date with new date value
mPeople[id] = date_added;
//[] instead of insert to replace existing id->llsd["date"] with new date value
mPeople[id] = userdata;
mChangedSignal();
}
@ -64,15 +70,55 @@ void LLRecentPeople::get(uuid_vec_t& result) const
result.push_back((*pos).first);
}
const LLDate& LLRecentPeople::getDate(const LLUUID& id) const
const LLDate LLRecentPeople::getDate(const LLUUID& id) const
{
recent_people_t::const_iterator it = mPeople.find(id);
if (it!= mPeople.end()) return (*it).second;
if (it!= mPeople.end()) return it->second["date"].asDate();
static LLDate no_date = LLDate();
return no_date;
}
const LLSD& LLRecentPeople::getData(const LLUUID& id) const
{
recent_people_t::const_iterator it = mPeople.find(id);
if (it != mPeople.end())
return it->second;
static LLSD no_data = LLSD();
return no_data;
}
bool LLRecentPeople::isAvalineCaller(const LLUUID& id) const
{
recent_people_t::const_iterator it = mPeople.find(id);
if (it != mPeople.end())
{
const LLSD& user = it->second;
return user["avaline_call"].asBoolean();
}
return false;
}
const LLUUID& LLRecentPeople::getIDByPhoneNumber(const LLSD& userdata)
{
if (!userdata["avaline_call"].asBoolean())
return LLUUID::null;
for (recent_people_t::const_iterator it = mPeople.begin(); it != mPeople.end(); ++it)
{
const LLSD& user_info = it->second;
if (user_info["call_number"].asString() == userdata["call_number"].asString())
return it->first;
}
return LLUUID::null;
}
// virtual
bool LLRecentPeople::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{

View File

@ -58,9 +58,15 @@ public:
* Add specified avatar to the list if it's not there already.
*
* @param id avatar to add.
*
* @param userdata additional information about last interaction party.
* For example when last interaction party is not an avatar
* but an avaline caller, additional info (such as phone
* number, session id and etc.) should be added.
*
* @return false if the avatar is in the list already, true otherwise
*/
bool add(const LLUUID& id);
bool add(const LLUUID& id, const LLSD& userdata = LLSD().with("date", LLDate::now()));
/**
* @param id avatar to search.
@ -75,7 +81,25 @@ public:
*/
void get(uuid_vec_t& result) const;
const LLDate& getDate(const LLUUID& id) const;
/**
* Returns last interaction time with specified participant
*
*/
const LLDate getDate(const LLUUID& id) const;
/**
* Returns data about specified participant
*
* @param id identifier of specific participant
*/
const LLSD& getData(const LLUUID& id) const;
/**
* Checks whether specific participant is an avaline caller
*
* @param id identifier of specific participant
*/
bool isAvalineCaller(const LLUUID& id) const;
/**
* Set callback to be called when the list changed.
@ -92,7 +116,10 @@ public:
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
private:
typedef std::map<LLUUID, LLDate> recent_people_t;
const LLUUID& getIDByPhoneNumber(const LLSD& userdata);
typedef std::map<LLUUID, LLSD> recent_people_t;
recent_people_t mPeople;
signal_t mChangedSignal;
};

View File

@ -65,6 +65,7 @@
#include "llinventorymodel.h"
#include "llmenugl.h"
#include "llmutelist.h"
#include "llnotificationsutil.h"
#include "llsidepaneltaskinfo.h"
#include "llslurl.h"
#include "llstatusbar.h"
@ -562,6 +563,103 @@ BOOL LLSelectMgr::removeObjectFromSelections(const LLUUID &id)
return object_found;
}
bool LLSelectMgr::linkObjects()
{
if (!LLSelectMgr::getInstance()->selectGetAllRootsValid())
{
LLNotificationsUtil::add("UnableToLinkWhileDownloading");
return true;
}
S32 object_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
if (object_count > MAX_CHILDREN_PER_TASK + 1)
{
LLSD args;
args["COUNT"] = llformat("%d", object_count);
int max = MAX_CHILDREN_PER_TASK+1;
args["MAX"] = llformat("%d", max);
LLNotificationsUtil::add("UnableToLinkObjects", args);
return true;
}
if (LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() < 2)
{
LLNotificationsUtil::add("CannotLinkIncompleteSet");
return true;
}
if (!LLSelectMgr::getInstance()->selectGetRootsModify())
{
LLNotificationsUtil::add("CannotLinkModify");
return true;
}
LLUUID owner_id;
std::string owner_name;
if (!LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name))
{
// we don't actually care if you're the owner, but novices are
// the most likely to be stumped by this one, so offer the
// easiest and most likely solution.
LLNotificationsUtil::add("CannotLinkDifferentOwners");
return true;
}
LLSelectMgr::getInstance()->sendLink();
return true;
}
bool LLSelectMgr::unlinkObjects()
{
LLSelectMgr::getInstance()->sendDelink();
return true;
}
// in order to link, all objects must have the same owner, and the
// agent must have the ability to modify all of the objects. However,
// we're not answering that question with this method. The question
// we're answering is: does the user have a reasonable expectation
// that a link operation should work? If so, return true, false
// otherwise. this allows the handle_link method to more finely check
// the selection and give an error message when the uer has a
// reasonable expectation for the link to work, but it will fail.
bool LLSelectMgr::enableLinkObjects()
{
bool new_value = false;
// check if there are at least 2 objects selected, and that the
// user can modify at least one of the selected objects.
// in component mode, can't link
if (!gSavedSettings.getBOOL("EditLinkedParts"))
{
if(LLSelectMgr::getInstance()->selectGetAllRootsValid() && LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() >= 2)
{
struct f : public LLSelectedObjectFunctor
{
virtual bool apply(LLViewerObject* object)
{
return object->permModify();
}
} func;
const bool firstonly = true;
new_value = LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, firstonly);
}
}
return new_value;
}
bool LLSelectMgr::enableUnlinkObjects()
{
LLViewerObject* first_editable_object = LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject();
bool new_value = LLSelectMgr::getInstance()->selectGetAllRootsValid() &&
first_editable_object &&
!first_editable_object->isAttachment();
return new_value;
}
void LLSelectMgr::deselectObjectAndFamily(LLViewerObject* object, BOOL send_to_sim, BOOL include_entire_object)
{
// bail if nothing selected or if object wasn't selected in the first place

View File

@ -439,6 +439,17 @@ public:
BOOL removeObjectFromSelections(const LLUUID &id);
////////////////////////////////////////////////////////////////
// Selection editing
////////////////////////////////////////////////////////////////
bool linkObjects();
bool unlinkObjects();
bool enableLinkObjects();
bool enableUnlinkObjects();
////////////////////////////////////////////////////////////////
// Selection accessors
////////////////////////////////////////////////////////////////

View File

@ -309,6 +309,15 @@ static bool handleRenderUseVBOChanged(const LLSD& newvalue)
return true;
}
static bool handleRenderUseVBOMappingChanged(const LLSD& newvalue)
{
if (gPipeline.isInit())
{
gPipeline.setDisableVBOMapping(newvalue.asBoolean());
}
return true;
}
static bool handleWLSkyDetailChanged(const LLSD&)
{
if (gSky.mVOWLSkyp.notNull())
@ -589,6 +598,7 @@ void settings_setup_listeners()
gSavedSettings.getControl("MuteAmbient")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
gSavedSettings.getControl("MuteUI")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
gSavedSettings.getControl("RenderVBOEnable")->getSignal()->connect(boost::bind(&handleRenderUseVBOChanged, _2));
gSavedSettings.getControl("RenderVBOMappingDisable")->getSignal()->connect(boost::bind(&handleRenderUseVBOMappingChanged, _2));
gSavedSettings.getControl("RenderUseStreamVBO")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("WLSkyDetail")->getSignal()->connect(boost::bind(&handleWLSkyDetailChanged, _2));
gSavedSettings.getControl("NumpadControl")->getSignal()->connect(boost::bind(&handleNumpadControlChanged, _2));

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -884,13 +884,14 @@ void LLViewerObjectList::clearDebugText()
void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
{
LLMemType mt(LLMemType::MTYPE_OBJECT);
if (mDeadObjects.count(objectp->mID))
if (mDeadObjects.find(objectp->mID) != mDeadObjects.end())
{
llinfos << "Object " << objectp->mID << " already on dead list, ignoring cleanup!" << llendl;
return;
llinfos << "Object " << objectp->mID << " already on dead list!" << llendl;
}
else
{
mDeadObjects.insert(objectp->mID);
}
mDeadObjects.insert(std::pair<LLUUID, LLPointer<LLViewerObject> >(objectp->mID, objectp));
// Cleanup any references we have to this object
// Remove from object map so noone can look it up.
@ -1140,6 +1141,45 @@ bool LLViewerObjectList::hasMapObjectInRegion(LLViewerRegion* regionp)
return false ;
}
//make sure the region is cleaned up.
void LLViewerObjectList::clearAllMapObjectsInRegion(LLViewerRegion* regionp)
{
std::set<LLViewerObject*> dead_object_list ;
std::set<LLViewerObject*> region_object_list ;
for (vobj_list_t::iterator iter = mMapObjects.begin(); iter != mMapObjects.end(); ++iter)
{
LLViewerObject* objectp = *iter;
if(objectp->isDead())
{
dead_object_list.insert(objectp) ;
}
else if(objectp->getRegion() == regionp)
{
region_object_list.insert(objectp) ;
}
}
if(dead_object_list.size() > 0)
{
llwarns << "There are " << dead_object_list.size() << " dead objects on the map!" << llendl ;
for(std::set<LLViewerObject*>::iterator iter = dead_object_list.begin(); iter != dead_object_list.end(); ++iter)
{
cleanupReferences(*iter) ;
}
}
if(region_object_list.size() > 0)
{
llwarns << "There are " << region_object_list.size() << " objects not removed from the deleted region!" << llendl ;
for(std::set<LLViewerObject*>::iterator iter = region_object_list.begin(); iter != region_object_list.end(); ++iter)
{
(*iter)->markDead() ;
}
}
}
void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
{
LLColor4 above_water_color = LLUIColorTable::instance().getColor( "NetMapOtherOwnAboveWater" );
@ -1159,7 +1199,11 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
{
LLViewerObject* objectp = *iter;
llassert_always(!objectp->isDead());
//llassert_always(!objectp->isDead());
if(objectp->isDead())//some dead objects somehow not cleaned.
{
continue ;
}
if (!objectp->getRegion() || objectp->isOrphaned() || objectp->isAttachment())
{

View File

@ -88,6 +88,7 @@ public:
void shiftObjects(const LLVector3 &offset);
bool hasMapObjectInRegion(LLViewerRegion* regionp) ;
void clearAllMapObjectsInRegion(LLViewerRegion* regionp) ;
void renderObjectsForMap(LLNetMap &netmap);
void renderObjectBounds(const LLVector3 &center);
@ -181,8 +182,7 @@ protected:
vobj_list_t mMapObjects;
typedef std::map<LLUUID, LLPointer<LLViewerObject> > vo_map;
vo_map mDeadObjects; // Need to keep multiple entries per UUID
std::set<LLUUID> mDeadObjects;
std::map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap;

View File

@ -2691,12 +2691,10 @@ void LLViewerFetchedTexture::saveRawImage()
mLastReferencedSavedRawImageTime = sCurrentTime ;
}
void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard, bool from_callback)
void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard)
{
if(!mForceToSaveRawImage || mDesiredSavedRawDiscardLevel < 0 || mDesiredSavedRawDiscardLevel > desired_discard)
{
llassert_always(from_callback || mBoostLevel == LLViewerTexture::BOOST_PREVIEW) ;
mForceToSaveRawImage = TRUE ;
mDesiredSavedRawDiscardLevel = desired_discard ;

View File

@ -465,7 +465,7 @@ public:
S32 getCachedRawImageLevel() const {return mCachedRawDiscardLevel;}
BOOL isCachedRawImageReady() const {return mCachedRawImageReady ;}
BOOL isRawImageValid()const { return mIsRawImageValid ; }
void forceToSaveRawImage(S32 desired_discard = 0, bool from_callback = false) ;
void forceToSaveRawImage(S32 desired_discard = 0) ;
/*virtual*/ void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) ;
void destroySavedRawImage() ;
LLImageRaw* getSavedRawImage() ;

File diff suppressed because it is too large Load Diff

View File

@ -71,6 +71,7 @@ LLVOCacheEntry::LLVOCacheEntry()
}
LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file)
: mBuffer(NULL)
{
S32 size = -1;
BOOL success;
@ -135,7 +136,10 @@ LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file)
LLVOCacheEntry::~LLVOCacheEntry()
{
delete [] mBuffer;
if(mBuffer)
{
delete[] mBuffer;
}
}

View File

@ -853,7 +853,7 @@ void LLVoiceChannelP2P::activate()
}
// Add the party to the list of people with which we've recently interacted.
LLRecentPeople::instance().add(mOtherUserID);
addToTheRecentPeopleList();
//Default mic is ON on initiating/joining P2P calls
if (!LLVoiceClient::getInstance()->getUserPTTState() && LLVoiceClient::getInstance()->getPTTIsToggle())
@ -938,3 +938,25 @@ void LLVoiceChannelP2P::setState(EState state)
LLVoiceChannel::setState(state);
}
void LLVoiceChannelP2P::addToTheRecentPeopleList()
{
bool avaline_call = LLIMModel::getInstance()->findIMSession(mSessionID)->isAvalineSessionType();
if (avaline_call)
{
LLSD call_data;
std::string call_number = LLVoiceChannel::getSessionName();
call_data["avaline_call"] = true;
call_data["session_id"] = mSessionID;
call_data["call_number"] = call_number;
call_data["date"] = LLDate::now();
LLRecentPeople::instance().add(mOtherUserID, call_data);
}
else
{
LLRecentPeople::instance().add(mOtherUserID);
}
}

View File

@ -191,6 +191,13 @@ protected:
virtual void setState(EState state);
private:
/**
* Add the caller to the list of people with which we've recently interacted
*
**/
void addToTheRecentPeopleList();
std::string mSessionHandle;
LLUUID mOtherUserID;
BOOL mReceivedCall;

View File

@ -282,7 +282,9 @@ void LLWorld::removeRegion(const LLHost &host)
updateWaterObjects();
llassert_always(!gObjectList.hasMapObjectInRegion(regionp)) ;
//double check all objects of this region are removed.
gObjectList.clearAllMapObjectsInRegion(regionp) ;
//llassert_always(!gObjectList.hasMapObjectInRegion(regionp)) ;
}
@ -1474,6 +1476,42 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi
}
}
}
// retrieve the list of close avatars from viewer objects as well
// for when we are above 1000m, only do this when we are retrieving
// uuid's too as there could be duplicates
if(avatar_ids != NULL)
{
for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
iter != LLCharacter::sInstances.end(); ++iter)
{
LLVOAvatar* pVOAvatar = (LLVOAvatar*) *iter;
if(pVOAvatar->isDead() || pVOAvatar->isSelf())
continue;
LLUUID uuid = pVOAvatar->getID();
if(uuid.isNull())
continue;
LLVector3d pos_global = pVOAvatar->getPositionGlobal();
if(dist_vec(pos_global, relative_to) <= radius)
{
bool found = false;
uuid_vec_t::iterator sel_iter = avatar_ids->begin();
for (; sel_iter != avatar_ids->end(); sel_iter++)
{
if(*sel_iter == uuid)
{
found = true;
break;
}
}
if(!found)
{
if(positions != NULL)
positions->push_back(pos_global);
avatar_ids->push_back(uuid);
}
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -111,6 +111,7 @@ public:
void resetVertexBuffers(LLDrawable* drawable);
void setUseVBO(BOOL use_vbo);
void setDisableVBOMapping(BOOL no_vbo_mapping);
void generateImpostor(LLVOAvatar* avatar);
void bindScreenToTexture();
void renderBloom(BOOL for_snapshot, F32 zoom_factor = 1.f, int subfield = 0);

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -115,6 +115,7 @@ with the same filename but different name
<texture name="DisclosureArrow_Opened_Off" file_name="widgets/DisclosureArrow_Opened_Off.png" preload="true" />
<texture name="ChatBarHandle" file_name="bottomtray/ChatBarHandle.png" preload="false" />
<texture name="DownArrow" file_name="bottomtray/DownArrow.png" preload="false" />
<texture name="DownArrow_Off" file_name="icons/DownArrow_Off.png" preload="false" />
<texture name="Dragbar" file_name="windows/Dragbar.png" preload="false" scale.left="35" scale.top="5" scale.right="29" scale.bottom="5" />

View File

@ -87,15 +87,9 @@ Gå til &apos;Verden&apos; &gt; &apos;Om land&apos; eller vælg en anden parcel
<text name="Owner:">
Ejer:
</text>
<text name="OwnerText">
Leyla Linden
</text>
<text name="Group:">
Gruppe:
</text>
<text name="GroupText">
Leyla Linden
</text>
<button label="Vælg" name="Set..."/>
<check_box label="Tillad dedikering til gruppe" name="check deed" tool_tip="En gruppe administrator kan dedikere denne jord til gruppen, så det vil blive støttet af gruppen&apos;s jord tildeling."/>
<button label="Dedikér" name="Deed..." tool_tip="Du kan kun dedikere jord, hvis du er en administrator i den valgte gruppe."/>
@ -396,7 +390,6 @@ Kun større parceller kan vises i søgning.
Hjemmeside:
</text>
<button label="Vælg" name="set_media_url"/>
<check_box label="Skjul medie URL" name="hide_media_url" tool_tip="Klik her for at skjule medie adressen så det kun er dig og evt. parcel gruppens ejer/administratorer der kan se den."/>
<text left="4" name="Description:">
Beskrivelse:
</text>
@ -424,7 +417,6 @@ Kun større parceller kan vises i søgning.
<check_box label="Gentag afspil" name="media_loop" tool_tip="Gentager automatisk medie, når det er færdigt med at spille starter det automatisk forfra."/>
</panel>
<panel label="LYD" name="land_audio_panel">
<check_box label="Skjul URL" name="hide_music_url" tool_tip="Ved at vælge her, vil musik URL skjules for alle ikke autoriserede brugere der læser denne parcels information."/>
<check_box label="Tillad stemmer" name="parcel_enable_voice_channel"/>
<check_box label="Tillad stemmer (håndteret af estate)" name="parcel_enable_voice_channel_is_estate_disabled"/>
<check_box label="Begræns stemme chat til denne parcel" name="parcel_enable_voice_channel_local"/>

View File

@ -24,16 +24,10 @@
<text name="LabelCreatorTitle">
Skaber:
</text>
<text name="LabelCreatorName">
Nicole Linden
</text>
<button label="Profil..." label_selected="" name="BtnCreator"/>
<text name="LabelOwnerTitle">
Ejer:
</text>
<text name="LabelOwnerName">
Thrax Linden
</text>
<button label="Profil..." label_selected="" name="BtnOwner"/>
<text name="LabelAcquiredTitle">
Erhvervet:

View File

@ -167,15 +167,9 @@
<text name="Creator:">
Skaber:
</text>
<text name="Creator Name">
Mrs. Esbee Linden (esbee.linden)
</text>
<text name="Owner:">
Ejer:
</text>
<text name="Owner Name">
Mrs. Erica &quot;Moose&quot; Linden (erica.linden)
</text>
<text name="Group:">
Gruppe:
</text>

View File

@ -10,8 +10,6 @@
<string name="Details">
[SL_PROFILE]
</string>
<text name="user_name_small" value="Grumpity ProductEngine med et langt navn"/>
<text name="user_slid" value="james.linden"/>
<text name="user_details">
Dette er min second life beskrivelse og jeg synes den er rigtig god. Men af en eller ande grund er min beskrivelse meget lang fordi jeg taler en hel masse
</text>

View File

@ -26,11 +26,7 @@
<text name="display_name_label" value="Visningsnavn:"/>
<text name="solo_username_label" value="Bugernavn:"/>
<button name="set_name" tool_tip="Sæt visningsnavn"/>
<text name="solo_user_name" value="Hamilton Hitchings"/>
<text name="user_name" value="Hamilton Hitchings"/>
<text name="user_name_small" value="Hamilton Hitchings"/>
<text name="user_label" value="Brugernavn:"/>
<text name="user_slid" value="hamilton.linden"/>
<panel name="lifes_images_panel">
<icon label="" name="2nd_life_edit_icon" tool_tip="Klik for at vælge et billede"/>
</panel>

View File

@ -10,10 +10,8 @@
<text name="solo_username_label" value="Brugernavn:"/>
<text name="status" value="Online"/>
<text name="user_name_small" value="Se på mig med dette enormt ekstremt super lange navn"/>
<text name="user_name" value="Jack Linden"/>
<button name="copy_to_clipboard" tool_tip="Kopiér til udskriftsholder"/>
<text name="user_label" value="Brugernavn:"/>
<text name="user_slid" value="jack.linden"/>
<tab_container name="tabs">
<panel label="PROFIL" name="panel_profile"/>
<panel label="FAVORITTER" name="panel_picks"/>

View File

@ -48,15 +48,9 @@
<text name="CreatorNameLabel">
Skaber:
</text>
<text name="Creator Name">
Erica Linden
</text>
<text name="Owner:">
Ejer:
</text>
<text name="Owner Name">
Erica Linden
</text>
<text name="Group_label">
Gruppe:
</text>

View File

@ -86,15 +86,9 @@
<text name="Owner:">
Eigentümer:
</text>
<text name="OwnerText">
Leyla Linden
</text>
<text name="Group:">
Gruppe:
</text>
<text name="GroupText">
Leyla Linden
</text>
<button label="Festlegen" label_selected="Einstellen..." name="Set..." width="90"/>
<check_box label="Übertragung an Gruppe zulassen" name="check deed" tool_tip="Ein Gruppen-Officer kann dieses Land der Gruppe übertragen. Das Land wird dann über die Landzuteilung der Gruppe verwaltet."/>
<button label="Übertragung" label_selected="Übertragen..." name="Deed..." tool_tip="Sie können Land nur übertragen, wenn Sie in der ausgewählten Gruppe Officer sind."/>
@ -398,7 +392,6 @@ Nur große Parzellen können in der Suche aufgeführt werden.
Homepage:
</text>
<button label="Festlegen" name="set_media_url"/>
<check_box label="URL ausblenden" name="hide_media_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Medien-URL sehen können. Diese Option ist für HTML-Medien nicht verfügbar."/>
<text name="Description:">
Inhalt:
</text>
@ -428,7 +421,6 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<text name="MusicURL:">
Musik-URL:
</text>
<check_box label="URL ausblenden" name="hide_music_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Musik-URL sehen können"/>
<text name="Sound:">
Sound:
</text>

View File

@ -24,16 +24,10 @@
<text name="LabelCreatorTitle">
Ersteller:
</text>
<text name="LabelCreatorName">
Nicole Linden
</text>
<button label="Profil..." label_selected="" name="BtnCreator"/>
<text name="LabelOwnerTitle">
Eigentümer:
</text>
<text name="LabelOwnerName">
Thrax Linden
</text>
<button label="Profil..." label_selected="" name="BtnOwner"/>
<text name="LabelAcquiredTitle">
Erworben:

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="script search" title="SKRIPT-SUCHE">
<check_box label="Groß-/Kleinschreibung irrelevant" name="case_text"/>
<check_box label="Groß-/Kleinschreibung ignorieren" name="case_text"/>
<button label="Suchen" label_selected="Suchen" name="search_btn"/>
<button label="Ersetzen" label_selected="Ersetzen" name="replace_btn"/>
<button label="Alle ersetzen" label_selected="Alle ersetzen" name="replace_all_btn"/>

View File

@ -170,15 +170,9 @@
<text name="Creator:">
Ersteller:
</text>
<text name="Creator Name">
Frau Esbee Linden (esbee.linden)
</text>
<text name="Owner:">
Eigentümer:
</text>
<text name="Owner Name">
Frau Erica &quot;Elch&quot; Linden (erica.linden)
</text>
<text name="Group:">
Gruppe:
</text>

View File

@ -10,9 +10,6 @@
<string name="Details">
[SL_PROFILE]
</string>
<text name="user_name_small" value="Launische Produktengine mit langem Namen"/>
<text name="user_name" value="Grumpity ProductEngine"/>
<text name="user_slid" value="james.linden"/>
<text name="user_subtitle" value="11 Monate und 3 Tage alt"/>
<text name="user_details">
Dies ist meine Second Life-Beschreibung und ich finde sie wirklich gut! Meine Beschreibung ist deshalb so lang, weil ich gerne rede.

View File

@ -16,9 +16,6 @@
<string name="YouAreMember">
Sie sind Mitglied
</string>
<text name="group_name">
Grumpitys schlecht gelaunte Elche
</text>
<text name="group_subtitle">
123 Mitglieder
</text>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_activeim_row">
<text name="contact_name">
Grumpity ProductEngine
</text>
</panel>

View File

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="im_header" name="im_header">
<text_editor name="user_name" value="Ericag Vader"/>
<text name="time_box" value="23:30"/>
</panel>

View File

@ -29,11 +29,7 @@
<text name="display_name_label" value="Anzeigename:"/>
<text name="solo_username_label" value="Benutzername:"/>
<button name="set_name" tool_tip="Anzeigenamen festlegen"/>
<text name="solo_user_name" value="Hamilton Hitchings"/>
<text name="user_name" value="Hamilton Hitchings"/>
<text name="user_name_small" value="Hamilton Hitchings"/>
<text name="user_label" value="Benutzername:"/>
<text name="user_slid" value="hamilton.linden"/>
<panel name="lifes_images_panel">
<panel name="second_life_image_panel">
<text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/>

View File

@ -10,7 +10,7 @@
Einige der ausgewählten Einwohner sind bereits Gruppenmitglieder und haben aus diesem Grund keine Einladung erhalten.
</panel.string>
<text name="help_text">
Sie können mehrere Einwohner Ihre Gruppe einladen. Klicken Sie hierzu auf „Einwohnerliste öffnen“.
Sie können mehrere Einwohner in Ihre Gruppe einladen. Klicken Sie hierzu auf „Einwohnerliste öffnen“.
</text>
<button label="Einwohnerliste öffnen" name="add_button" tool_tip=""/>
<name_list name="invitee_list" tool_tip="Halten Sie zur Mehrfachauswahl die Strg-Taste gedrückt und klicken Sie auf die Namen."/>

View File

@ -4,7 +4,6 @@
6
</string>
<panel label="im_header" name="im_header">
<text name="user_name" value="Erica Vader"/>
<text name="time_box" value="23:30"/>
</panel>
<button label="Antworten" name="reply"/>

View File

@ -10,10 +10,8 @@
<text name="solo_username_label" value="Benutzername:"/>
<text name="status" value="Online"/>
<text name="user_name_small" value="Dieser Name ist ein ganz außerordentlich langer Name"/>
<text name="user_name" value="Jack Linden"/>
<button name="copy_to_clipboard" tool_tip="In Zwischenablage kopieren"/>
<text name="user_label" value="Benutzername:"/>
<text name="user_slid" value="jack.linden"/>
<tab_container name="tabs" tab_min_width="60">
<panel label="PROFIL" name="panel_profile"/>
<panel label="AUSWAHL" name="panel_picks"/>

View File

@ -48,15 +48,9 @@
<text name="CreatorNameLabel">
Ersteller:
</text>
<text name="Creator Name">
Erica Linden
</text>
<text name="Owner:">
Eigentümer:
</text>
<text name="Owner Name">
Erica Linden
</text>
<text name="Group_label">
Gruppe:
</text>

View File

@ -220,9 +220,10 @@
layout="topleft"
left_pad="2"
name="OwnerText"
translate="false"
use_ellipses="true"
width="360">
Leyla Linden
TestString PleaseIgnore
</text>
<button
follows="right"
@ -260,8 +261,10 @@
left_pad="2"
layout="topleft"
name="GroupText"
translate="false"
width="240">
Leyla Linden </text>
TestString PleaseIgnore
</text>
<button
follows="right"
height="23"
@ -1404,6 +1407,10 @@ Only large parcels can be listed in search.
label="Shopping"
name="item11"
value="shopping" />
<combo_box.item
label="Rental"
name="item13"
value="rental" />
<combo_box.item
label="Other"
name="item12"
@ -1461,6 +1468,10 @@ Only large parcels can be listed in search.
label="Shopping"
name="item11"
value="shopping" />
<combo_box.item
label="Rental"
name="item13"
value="rental" />
<combo_box.item
label="Other"
name="item12"
@ -1638,16 +1649,6 @@ Only large parcels can be listed in search.
name="set_media_url"
width="70"
top_delta="0"/>
<check_box
follows="top|left"
height="16"
label="Hide URL"
layout="topleft"
left="110"
name="hide_media_url"
tool_tip="Checking this option will hide the media url to any non-authorized viewers of this parcel information. Note this is not available for HTML types."
width="50"
top_pad="5"/>
<text
type="string"
length="1"
@ -1825,15 +1826,6 @@ Only large parcels can be listed in search.
top_delta="0"
right="-15"
select_on_focus="true" />
<check_box
height="16"
label="Hide URL"
layout="topleft"
name="hide_music_url"
tool_tip="Checking this option will hide the music url to any non-authorized viewers of this parcel information."
left_delta="10"
top_pad="5"
width="292" />
<text
type="string"
length="1"
@ -2078,7 +2070,7 @@ Only large parcels can be listed in search.
layout="topleft"
left_pad="10"
name="remove_allowed"
right="-1"
right="-10"
width="100" />
</panel>
<panel
@ -2128,7 +2120,7 @@ Only large parcels can be listed in search.
layout="topleft"
left_pad="10"
name="remove_banned"
right="-1"
right="-10"
width="100" />
</panel>
</panel>

View File

@ -96,7 +96,7 @@
left="10"
max_val="2"
name="gamma"
top_pad="7"
top_pad="11"
width="262" />
<text
type="string"

View File

@ -106,9 +106,10 @@
left_delta="78"
name="LabelCreatorName"
top_delta="0"
translate="false"
use_ellipses="true"
width="170">
Nicole Linden
TestString PleaseIgnore
</text>
<button
follows="top|right"
@ -140,9 +141,10 @@
left_delta="78"
name="LabelOwnerName"
top_delta="0"
translate="false"
use_ellipses="true"
width="170">
Thrax Linden
TestString PleaseIgnore
</text>
<button
follows="top|right"

View File

@ -2,6 +2,7 @@
<floater
name="region_debug_console"
title="Region Debug"
can_resize="true"
layout="topleft"
min_height="300"
min_width="300"
@ -12,7 +13,7 @@
left="10"
type="string"
length="1"
follows="left|top|right|bottom"
follows="left|right|bottom"
font="Monospace"
height="366"
width="576"

View File

@ -248,30 +248,53 @@
function="BuildTool.commitRadioEdit"/>
</radio_group>
<check_box
left="10"
left="5"
follows="left|top"
height="28"
control_name="EditLinkedParts"
label="Edit linked"
layout="topleft"
name="checkbox edit linked parts"
top_pad="2">
top_pad="-10">
<check_box.commit_callback
function="BuildTool.selectComponent"/>
</check_box>
<text
text_color="LtGray_50"
follows="top|left"
halign="left"
left="13"
name="RenderingCost"
tool_tip="Shows the rendering cost calculated for this object"
top_pad="0"
type="string"
width="100">
þ: [COUNT]
</text>
<button
follows="left|top"
height="23"
label="Link"
top_pad="2"
layout="topleft"
left="5"
name="link_btn"
width="50">
<button.commit_callback
function="BuildTool.LinkObjects"/>
</button>
<button
follows="left|top"
height="23"
label="Unlink"
layout="topleft"
left_pad="2"
name="unlink_btn"
width="50">
<button.commit_callback
function="BuildTool.UnlinkObjects"/>
</button>
<text
text_color="LtGray_50"
follows="top|left"
halign="left"
left_pad="3"
name="RenderingCost"
tool_tip="Shows the rendering cost calculated for this object"
top_delta="11"
type="string"
width="100">
þ: [COUNT]
</text>
<check_box
control_name="ScaleUniform"
height="19"
@ -299,7 +322,7 @@
layout="topleft"
left="143"
name="checkbox stretch textures"
top_pad="7"
top_pad="-6"
width="134" />
<check_box
control_name="SnapEnabled"
@ -876,10 +899,11 @@
layout="topleft"
name="Creator Name"
top_delta="0"
translate="false"
width="190"
word_wrap="true"
use_ellipses="true">
Mrs. Esbee Linden (esbee.linden)
TestString PleaseIgnore (please.ignore)
</text>
<text
type="string"
@ -903,10 +927,11 @@
name="Owner Name"
left_pad="0"
top_delta="0"
translate="false"
width="190"
word_wrap="true"
use_ellipses="true">
Mrs. Erica "Moose" Linden (erica.linden)
TestString PleaseIgnore (please.ignore)
</text>
<text
type="string"

View File

@ -40,10 +40,11 @@
name="user_name_small"
top="7"
text_color="White"
translate="false"
use_ellipses="true"
word_wrap="true"
visible="false"
value="Grumpity ProductEngine with a long name"
value="TestString PleaseIgnore"
width="185" />
<text
follows="top|left"
@ -53,8 +54,9 @@
name="user_name"
top="10"
text_color="White"
translate="false"
use_ellipses="true"
value="Grumpity ProductEngine"
value="TestString PleaseIgnore"
width="190" />
<text
follows="top|left"
@ -63,7 +65,8 @@
name="user_slid"
font="SansSerifSmallBold"
text_color="EmphasisColor"
value="james.linden"
translate="false"
value="teststring.pleaseignore"
width="185"
use_ellipses="true" />
<text

View File

@ -28,10 +28,11 @@
name="group_name"
top="10"
text_color="White"
translate="false"
use_ellipses="true"
width="175"
word_wrap="false">
Grumpity&apos;s Grumpy Group of Moose
TestString PleaseIgnore
</text>
<text
follows="all"

View File

@ -8,6 +8,18 @@
top="624"
visible="false"
width="128">
<menu_item_check
label="Voice Enabled"
layout="topleft"
name="EnableVoiceChat">
<menu_item_check.on_click
function="ToggleControl"
parameter="EnableVoiceChat" />
<menu_item_check.on_check
function="CheckControl"
parameter="EnableVoiceChat" />
</menu_item_check>
<menu_item_separator/>
<menu_item_check
label="Gesture button"
layout="topleft"

View File

@ -65,6 +65,7 @@
speaker.visible="false">
</chiclet_im_adhoc>
<text
translate="false"
type="string"
name="contact_name"
layout="topleft"
@ -76,7 +77,7 @@
follows="right|left"
use_ellipses="true"
font="SansSerifBold">
Grumpity ProductEngine
TestString PleaseIgnore
</text>
<button
top="10"

View File

@ -45,11 +45,11 @@
min_width="214"
height="28"
mouse_opaque="false"
name="chat_bar_layout_panel"
name="chat_bar_layout_panel"
user_resize="true"
width="308" >
width="310" >
<panel
name="chat_bar"
name="chat_bar"
filename="panel_nearby_chat_bar.xml"
left="0"
height="28"
@ -60,11 +60,30 @@
/>
</layout_panel>
<!--
There is resize bar between chatbar and Speak button. It has 2px width (is is set as 2*UIResizeBarOverlap)
This 5px Panel is an indicator of where the resize handle is.
The panel provides a gap between the resize handle icon and a button to the right.
-->
<layout_panel
auto_resize="false"
follows="right"
layout="topleft"
max_width="5"
min_width="5"
name="chat_bar_resize_handle_panel"
user_resize="false"
width="5">
<icon
follows="top|right"
height="25"
image_name="ChatBarHandle"
layout="topleft"
left="-7"
name="resize_handle"
top="4"
width="5" />
</layout_panel>
<layout_panel
auto_resize="false"
follows="left|right"
height="28"
layout="topleft"
min_height="28"
@ -72,13 +91,13 @@
mouse_opaque="false"
name="speak_panel"
top_delta="0"
user_resize="true"
width="110">
user_resize="false"
width="108">
<talk_button
follows="left|right"
height="23"
layout="topleft"
left="2"
left="0"
name="talk"
top="5"
width="105">

View File

@ -35,9 +35,10 @@
text_color="white"
bg_readonly_color="black"
top="0"
translate="false"
use_ellipses="true"
valign="bottom"
value="Ericag Vader" />
value="TestString PleaseIgnore" />
<text
allow_scroll="false"
font="SansSerifSmall"

View File

@ -183,17 +183,17 @@
left="8"
name="bottom_panel"
top_pad="5"
width="303">
width="315">
<layout_stack
follows="bottom|left|right"
height="23"
layout="topleft"
name="layout_stack1"
left="2"
left="0"
orientation="horizontal"
top_pad="0"
width="303">
width="313">
<layout_panel
follows="bottom|left|right"
@ -223,7 +223,7 @@
name="layout_panel1"
user_resize="false"
auto_resize="true"
width="150">
width="146">
<button
follows="bottom|left|right"
height="23"
@ -232,7 +232,7 @@
name="cancel_btn"
top="0"
left="1"
width="149" />
width="145" />
</layout_panel>
</layout_stack>

Some files were not shown because too many files have changed in this diff Show More