From d0c66e5efbef3f32657e1c943a6c09e8a418a9be Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 19 May 2014 14:59:07 +0200 Subject: [PATCH 01/34] Actually hide the export box on SL. Must have been asleep when I coded that. --- indra/newview/llfloaterperms.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llfloaterperms.cpp b/indra/newview/llfloaterperms.cpp index a85abb1a6..df815fd2f 100644 --- a/indra/newview/llfloaterperms.cpp +++ b/indra/newview/llfloaterperms.cpp @@ -82,7 +82,7 @@ BOOL LLFloaterPerms::postBuild() bool export_support = LFSimFeatureHandler::instance().simSupportsExport(); const U32 next_owner_perms = getNextOwnerPerms(); childSetEnabled("everyone_export", export_support && (next_owner_perms & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED); - if (!gHippoGridManager->getCurrentGrid()->isSecondLife()) + if (gHippoGridManager->getCurrentGrid()->isSecondLife()) childSetVisible("everyone_export", false); if (!(next_owner_perms & PERM_COPY)) From eb910b0bae90c2d6978779acdc113f83468fbf64 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sat, 23 Aug 2014 20:50:56 -0500 Subject: [PATCH 02/34] Use /Zm140 for all windows builds. --- indra/cmake/00-Common.cmake | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index efffa89b0..3e4af159b 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -54,10 +54,8 @@ if (WINDOWS) # Remove default /Zm1000 flag that cmake inserts string (REPLACE "/Zm1000" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - if (MSVC11) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zm140") - endif (MSVC11) - + # Always use /Zm140 + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zm140") # Don't build DLLs. set(BUILD_SHARED_LIBS OFF) From 4b205084f83740e9c3a720ffc37a1a7fbf2555b5 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sat, 23 Aug 2014 20:52:01 -0500 Subject: [PATCH 03/34] Fix develop.py 'build' command. --- indra/develop.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/develop.py b/indra/develop.py index 024bd92cb..83c76b10f 100755 --- a/indra/develop.py +++ b/indra/develop.py @@ -169,7 +169,7 @@ class PlatformSetup(object): raise def parse_build_opts(self, arguments): - opts, targets = getopt.getopt(arguments, 'o:', ['option=']) + opts, targets = getopt.getopt(arguments, 'D:o:', ['option=']) build_opts = [] for o, a in opts: if o in ('-o', '--option'): From 5535ba6b47132aa47607b7a7c75bf04f28e301eb Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sat, 30 Aug 2014 16:25:46 -0500 Subject: [PATCH 04/34] Fix issue with paths with spaces, in viewer_manifest.py --- indra/newview/viewer_manifest.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 51d47563e..cbb23b376 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -453,14 +453,14 @@ class WindowsManifest(ViewerManifest): try: import _winreg as reg NSIS_path = reg.QueryValue(reg.HKEY_LOCAL_MACHINE, r"SOFTWARE\NSIS\Unicode") + '\\makensis.exe' - self.run_command('"' + proper_windows_path(NSIS_path) + '" ' + self.dst_path_of(tempfile)) + self.run_command('"' + proper_windows_path(NSIS_path) + '" "' + self.dst_path_of(tempfile) + '"') except: try: NSIS_path = os.environ['ProgramFiles'] + '\\NSIS\\Unicode\\makensis.exe' - self.run_command('"' + proper_windows_path(NSIS_path) + '" ' + self.dst_path_of(tempfile)) + self.run_command('"' + proper_windows_path(NSIS_path) + '" "' + self.dst_path_of(tempfile) + '"') except: NSIS_path = os.environ['ProgramFiles(X86)'] + '\\NSIS\\Unicode\\makensis.exe' - self.run_command('"' + proper_windows_path(NSIS_path) + '" ' + self.dst_path_of(tempfile)) + self.run_command('"' + proper_windows_path(NSIS_path) + '" "' + self.dst_path_of(tempfile) + '"') # self.remove(self.dst_path_of(tempfile)) # If we're on a build machine, sign the code using our Authenticode certificate. JC sign_py = os.path.expandvars("{SIGN_PY}") From 9c63243fe79324a728698fc8323fa02d2f607a36 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sat, 30 Aug 2014 18:56:27 -0500 Subject: [PATCH 05/34] Fix issue with planar face alignment. --- indra/newview/llface.cpp | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 86b840c03..6f89b5629 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -987,15 +987,15 @@ void LLFace::getPlanarProjectedParams(LLQuaternion* face_rot, LLVector3* face_po { const LLMatrix4a& vol_mat = getWorldMatrix(); const LLVolumeFace& vf = getViewerObject()->getVolume()->getVolumeFace(mTEOffset); - const LLVector4a& normal4a = vf.mNormals[0]; + const LLVector4a& normal = vf.mNormals[0]; const LLVector4a& tangent = vf.mTangents[0]; - LLVector4a binormal4a; - binormal4a.setCross3(normal4a, tangent); - binormal4a.mul(tangent.getF32ptr()[3]); + LLVector4a binormal; + binormal.setCross3(normal, tangent); + binormal.mul(tangent.getF32ptr()[3]); LLVector2 projected_binormal; - planarProjection(projected_binormal, normal4a, *vf.mCenter, binormal4a); + planarProjection(projected_binormal, normal, *vf.mCenter, binormal); projected_binormal -= LLVector2(0.5f, 0.5f); // this normally happens in xform() *scale = projected_binormal.length(); // rotate binormal to match what planarProjection() thinks it is, @@ -1004,19 +1004,15 @@ void LLFace::getPlanarProjectedParams(LLQuaternion* face_rot, LLVector3* face_po F32 ang = acos(projected_binormal.mV[VY]); ang = (projected_binormal.mV[VX] < 0.f) ? -ang : ang; - LLMatrix4a rot = gGL.genRot(ang, normal4a); - rot.rotate(binormal4a, binormal4a); + gGL.genRot(ang, normal).rotate(binormal, binormal); LLVector4a x_axis; - x_axis.setCross3(binormal4a, normal4a); + x_axis.setCross3(binormal, normal); - LLQuaternion2 local_rot(LLQuaternion( LLVector3(x_axis.getF32ptr()), LLVector3(binormal4a.getF32ptr()), LLVector3(normal4a.getF32ptr()) )); + //VECTORIZE THIS + LLQuaternion local_rot(LLVector3(x_axis.getF32ptr()), LLVector3(binormal.getF32ptr()), LLVector3(normal.getF32ptr())); + *face_rot = local_rot * LLMatrix4(vol_mat.getF32ptr()).quaternion(); - LLMatrix4 vol_mat2(vol_mat.getF32ptr()); - - local_rot.mul(LLQuaternion2(vol_mat2.quaternion())); - - *face_rot = LLQuaternion(local_rot.getVector4a().getF32ptr()); face_pos->set(vol_mat.getRow().getF32ptr()); } From 547d9817dbbad1a6577d00d4dc6feb46501be7d4 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sat, 30 Aug 2014 18:57:12 -0500 Subject: [PATCH 06/34] Replace \t with spaces in develop.py. --- indra/develop.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/indra/develop.py b/indra/develop.py index 83c76b10f..a4101b138 100755 --- a/indra/develop.py +++ b/indra/develop.py @@ -612,15 +612,15 @@ class WindowsSetup(PlatformSetup): if environment == '': environment = self.find_visual_studio_express() if environment == '': - environment = self.find_visual_studio_express_single() - if environment == '': - print >> sys.stderr, "Something went very wrong during build stage, could not find a Visual Studio?" - else: - build_dirs=self.build_dirs() - print >> sys.stderr, "\nSolution generation complete, it can can now be found in:", build_dirs[0] - print >> sys.stderr, "\nAs you are using an Express Visual Studio, the build step cannot be automated" - print >> sys.stderr, "\nPlease see https://wiki.secondlife.com/wiki/Microsoft_Visual_Studio#Extra_steps_for_Visual_Studio_Express_editions for Visual Studio Express specific information" - exit(0) + environment = self.find_visual_studio_express_single() + if environment == '': + print >> sys.stderr, "Something went very wrong during build stage, could not find a Visual Studio?" + else: + build_dirs=self.build_dirs() + print >> sys.stderr, "\nSolution generation complete, it can can now be found in:", build_dirs[0] + print >> sys.stderr, "\nAs you are using an Express Visual Studio, the build step cannot be automated" + print >> sys.stderr, "\nPlease see https://wiki.secondlife.com/wiki/Microsoft_Visual_Studio#Extra_steps_for_Visual_Studio_Express_editions for Visual Studio Express specific information" + exit(0) # devenv.com is CLI friendly, devenv.exe... not so much. return ('"%sdevenv.com" %s.sln /build %s' % From afe573d2ebc52a8b9572c2ad1c885a2903dc9548 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sat, 30 Aug 2014 23:47:32 -0500 Subject: [PATCH 07/34] Spaces in path... and nsi script... issues. --- indra/newview/installers/windows/installer_template.nsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index 8399d9f56..33549a02b 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -77,8 +77,8 @@ Name "${VIEWERNAME}" SubCaption 0 $(LicenseSubTitleSetup) ; override "license agreement" text BrandingText "Prepare to Implode!" ; bottom of window text -Icon %%SOURCE%%\installers\windows\${INSTALL_ICON} -UninstallIcon %%SOURCE%%\installers\windows\${UNINSTALL_ICON} +Icon "%%SOURCE%%\installers\windows\${INSTALL_ICON}" +UninstallIcon "%%SOURCE%%\installers\windows\${UNINSTALL_ICON}" WindowIcon off ; show our icon in left corner # BGGradient 9090b0 000000 notext CRCCheck on ; make sure CRC is OK From c7e9430f998c7e20af4d1a4940d82632e6a51a76 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sat, 30 Aug 2014 23:48:56 -0500 Subject: [PATCH 08/34] Avoid erroneously creating 'About Land' instance. Also avoid issuing 'ParcelPropertiesRequest' excessively. --- indra/newview/llagent.cpp | 3 ++- indra/newview/llfloaterland.cpp | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 7fb21ab0d..cf5e3a3c8 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -3973,7 +3973,8 @@ bool LLAgent::teleportCore(bool is_local) LLFloaterWorldMap::hide(); // hide land floater too - it'll be out of date - LLFloaterLand::hideInstance(); + if (LLFloaterLand::findInstance()) + LLFloaterLand::hideInstance(); LLViewerParcelMgr::getInstance()->deselectLand(); LLViewerMediaFocus::getInstance()->clearFocus(); diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index d76a43566..874e45c49 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -257,7 +257,9 @@ LLFloaterLand::~LLFloaterLand() // public void LLFloaterLand::refresh() { - if (LLViewerParcelMgr::getInstance()->selectionEmpty()) + if (!instanceVisible()) + return; + if (LLViewerParcelMgr::getInstance()->selectionEmpty() && mParcel->getParcel() == NULL) LLViewerParcelMgr::getInstance()->selectParcelAt(gAgent.getPositionGlobal()); mPanelGeneral->refresh(); mPanelObjects->refresh(); From 8e45003c27738fe0eef6a228f5d9a9bd132ad256 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sun, 31 Aug 2014 04:56:55 -0500 Subject: [PATCH 09/34] Packaging bugs. I'm drowning in them. (use subprocess.Popen instead of os.popen) --- indra/develop.py | 8 ++++---- indra/lib/python/indra/util/llmanifest.py | 10 +++++----- indra/newview/viewer_manifest.py | 8 ++++---- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/indra/develop.py b/indra/develop.py index a4101b138..780f74895 100755 --- a/indra/develop.py +++ b/indra/develop.py @@ -628,7 +628,7 @@ class WindowsSetup(PlatformSetup): def run(self, command, name=None): '''Run a program. If the program fails, raise an exception.''' - ret = os.system(command) + ret = os.system(command.encode('utf-8')) if ret: if name is None: name = command.split(None, 1)[0] @@ -662,7 +662,7 @@ class WindowsSetup(PlatformSetup): os.path.join(build_dir,'Singularity.sln') + ' --config ' + self.build_type + ' --startup secondlife-bin') - print 'Running %r in %r' % (vstool_cmd, getcwd()) + print 'Running vstool %r in %r' % (vstool_cmd, getcwd()) self.run(vstool_cmd) print >> open(stamp, 'w'), self.build_type @@ -676,11 +676,11 @@ class WindowsSetup(PlatformSetup): if targets: for t in targets: cmd = '%s /project %s %s' % (build_cmd, t, ' '.join(opts)) - print 'Running %r in %r' % (cmd, d) + print 'Running build(targets) %r in %r' % (cmd, d) self.run(cmd) else: cmd = '%s %s' % (build_cmd, ' '.join(opts)) - print 'Running %r in %r' % (cmd, d) + print 'Running build %r in %r' % (cmd, d) self.run(cmd) finally: os.chdir(cwd) diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py index 1522e3e9a..3305a39d7 100644 --- a/indra/lib/python/indra/util/llmanifest.py +++ b/indra/lib/python/indra/util/llmanifest.py @@ -39,6 +39,7 @@ import shutil import sys import tarfile import errno +import subprocess def path_ancestors(path): drive, path = os.path.splitdrive(os.path.normpath(path)) @@ -393,20 +394,19 @@ class LLManifest(object): debugging/informational purpoases, prints out the command's output as it is received.""" print "Running command:", command - fd = os.popen(command, 'r') + fd = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) lines = [] while True: - lines.append(fd.readline()) + lines.append(fd.stdout.readline().rstrip('\n')) if lines[-1] == '': break else: print lines[-1], output = ''.join(lines) - status = fd.close() - if status: + if fd.returncode: raise RuntimeError( "Command %s returned non-zero status (%s) \noutput:\n%s" - % (command, status, output) ) + % (command, fd.returncode, output) ) return output def created_path(self, path): diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index cbb23b376..9042b65ce 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -360,7 +360,7 @@ class WindowsManifest(ViewerManifest): out_path = installed_dir result += 'SetOutPath ' + out_path + '\n' if install: - result += 'File ' + pkg_file + '\n' + result += 'File "' + pkg_file + '"\n' else: result += 'Delete ' + wpath(os.path.join('$INSTDIR', rel_file)) + '\n' @@ -453,14 +453,14 @@ class WindowsManifest(ViewerManifest): try: import _winreg as reg NSIS_path = reg.QueryValue(reg.HKEY_LOCAL_MACHINE, r"SOFTWARE\NSIS\Unicode") + '\\makensis.exe' - self.run_command('"' + proper_windows_path(NSIS_path) + '" "' + self.dst_path_of(tempfile) + '"') + self.run_command([proper_windows_path(NSIS_path), self.dst_path_of(tempfile)]) except: try: NSIS_path = os.environ['ProgramFiles'] + '\\NSIS\\Unicode\\makensis.exe' - self.run_command('"' + proper_windows_path(NSIS_path) + '" "' + self.dst_path_of(tempfile) + '"') + self.run_command([proper_windows_path(NSIS_path), self.dst_path_of(tempfile)]) except: NSIS_path = os.environ['ProgramFiles(X86)'] + '\\NSIS\\Unicode\\makensis.exe' - self.run_command('"' + proper_windows_path(NSIS_path) + '" "' + self.dst_path_of(tempfile) + '"') + self.run_command([proper_windows_path(NSIS_path),self.dst_path_of(tempfile)]) # self.remove(self.dst_path_of(tempfile)) # If we're on a build machine, sign the code using our Authenticode certificate. JC sign_py = os.path.expandvars("{SIGN_PY}") From 992bbbba1c71d4db239f08f2f110c6a9e1b633c6 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Mon, 1 Sep 2014 00:47:39 -0500 Subject: [PATCH 10/34] A bit of cleanup, and call subprocess.Popen with shell=True. --- indra/develop.py | 2 +- indra/lib/python/indra/util/llmanifest.py | 6 +++--- indra/newview/viewer_manifest.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/indra/develop.py b/indra/develop.py index 780f74895..d3a77ae07 100755 --- a/indra/develop.py +++ b/indra/develop.py @@ -628,7 +628,7 @@ class WindowsSetup(PlatformSetup): def run(self, command, name=None): '''Run a program. If the program fails, raise an exception.''' - ret = os.system(command.encode('utf-8')) + ret = os.system(command) if ret: if name is None: name = command.split(None, 1)[0] diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py index 3305a39d7..625d1456f 100644 --- a/indra/lib/python/indra/util/llmanifest.py +++ b/indra/lib/python/indra/util/llmanifest.py @@ -394,14 +394,14 @@ class LLManifest(object): debugging/informational purpoases, prints out the command's output as it is received.""" print "Running command:", command - fd = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + fd = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) lines = [] while True: - lines.append(fd.stdout.readline().rstrip('\n')) + lines.append(fd.stdout.readline()) if lines[-1] == '': break else: - print lines[-1], + print lines[-1].rstrip('\n'), output = ''.join(lines) if fd.returncode: raise RuntimeError( diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 9042b65ce..82c26c99c 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -358,11 +358,11 @@ class WindowsManifest(ViewerManifest): if installed_dir != out_path: if install: out_path = installed_dir - result += 'SetOutPath ' + out_path + '\n' + result += 'SetOutPath "' + out_path + '"\n' if install: result += 'File "' + pkg_file + '"\n' else: - result += 'Delete ' + wpath(os.path.join('$INSTDIR', rel_file)) + '\n' + result += 'Delete "' + wpath(os.path.join('$INSTDIR', rel_file)) + '"\n' # at the end of a delete, just rmdir all the directories if not install: From e9cf3a680668bc038717b016fc12c3abadcdb3f4 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Tue, 2 Sep 2014 02:53:10 -0500 Subject: [PATCH 11/34] Fix tiled snapshots. Also, LLRender::genRot takes degrees, not radians. --- indra/newview/llface.cpp | 2 +- indra/newview/llviewercamera.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 6f89b5629..984aabf32 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1004,7 +1004,7 @@ void LLFace::getPlanarProjectedParams(LLQuaternion* face_rot, LLVector3* face_po F32 ang = acos(projected_binormal.mV[VY]); ang = (projected_binormal.mV[VX] < 0.f) ? -ang : ang; - gGL.genRot(ang, normal).rotate(binormal, binormal); + gGL.genRot(RAD_TO_DEG * ang, normal).rotate(binormal, binormal); LLVector4a x_axis; x_axis.setCross3(binormal, normal); diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp index ba35d78d8..041e804e7 100644 --- a/indra/newview/llviewercamera.cpp +++ b/indra/newview/llviewercamera.cpp @@ -293,8 +293,8 @@ void LLViewerCamera::setPerspective(BOOL for_selection, int pos_y = mZoomSubregion / llceil(mZoomFactor); int pos_x = mZoomSubregion - (pos_y*llceil(mZoomFactor)); - proj_mat.applyScale_affine(mZoomFactor,mZoomFactor,1.f); proj_mat.applyTranslation_affine(offset - (F32)pos_x * 2.f, offset - (F32)pos_y * 2.f, 0.f); + proj_mat.applyScale_affine(mZoomFactor,mZoomFactor,1.f); } calcProjection(z_far); // Update the projection matrix cache From 74704d0d2aadabb53100e8b3c2ada0e1818a9150 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Tue, 2 Sep 2014 10:53:36 -0400 Subject: [PATCH 12/34] Fix crash signature 608 This was a crash in LLPanelDirClassified::postBuild(), on the line changed here, probably accessng null pointer. There are probably a few other signatures for this in our database. --- indra/newview/llpaneldirclassified.cpp | 3 ++- indra/newview/llpaneldirevents.cpp | 3 ++- indra/newview/llpaneldirfind.cpp | 5 ++++- indra/newview/llpaneldirgroups.cpp | 3 ++- indra/newview/llpaneldirland.cpp | 3 ++- indra/newview/llpaneldirplaces.cpp | 3 ++- 6 files changed, 14 insertions(+), 6 deletions(-) diff --git a/indra/newview/llpaneldirclassified.cpp b/indra/newview/llpaneldirclassified.cpp index 2bc854864..fb26e398f 100644 --- a/indra/newview/llpaneldirclassified.cpp +++ b/indra/newview/llpaneldirclassified.cpp @@ -119,7 +119,8 @@ BOOL LLPanelDirClassified::postBuild() // Don't do this every time we open find, it's expensive; require clicking 'search' //requestClassified(); - childSetVisible("filter_gaming", (gAgent.getRegion()->getGamingFlags() & REGION_GAMING_PRESENT) && !(gAgent.getRegion()->getGamingFlags() & REGION_GAMING_HIDE_FIND_CLASSIFIEDS)); + LLViewerRegion* region(gAgent.getRegion()); + getChildView("filter_gaming")->setVisible(region && (region->getGamingFlags() & REGION_GAMING_PRESENT) && !(region->getGamingFlags() & REGION_GAMING_HIDE_FIND_CLASSIFIEDS)); return TRUE; } diff --git a/indra/newview/llpaneldirevents.cpp b/indra/newview/llpaneldirevents.cpp index 8b7453b1b..f38b7efa7 100644 --- a/indra/newview/llpaneldirevents.cpp +++ b/indra/newview/llpaneldirevents.cpp @@ -93,7 +93,8 @@ BOOL LLPanelDirEvents::postBuild() } gDisplayEventHack = FALSE; - childSetVisible("filter_gaming", (gAgent.getRegion()->getGamingFlags() & REGION_GAMING_PRESENT) && !(gAgent.getRegion()->getGamingFlags() & REGION_GAMING_HIDE_FIND_EVENTS)); + LLViewerRegion* region(gAgent.getRegion()); + getChildView("filter_gaming")->setVisible(region && (gAgent.getRegion()->getGamingFlags() & REGION_GAMING_PRESENT) && !(gAgent.getRegion()->getGamingFlags() & REGION_GAMING_HIDE_FIND_EVENTS)); return TRUE; } diff --git a/indra/newview/llpaneldirfind.cpp b/indra/newview/llpaneldirfind.cpp index 5e132cb07..08f685f80 100644 --- a/indra/newview/llpaneldirfind.cpp +++ b/indra/newview/llpaneldirfind.cpp @@ -250,7 +250,10 @@ BOOL LLPanelDirFind::postBuild() } if (LLUICtrl* ctrl = findChild("filter_gaming")) - ctrl->setVisible(gAgent.getRegion() && (gAgent.getRegion()->getGamingFlags() & REGION_GAMING_PRESENT) && !(gAgent.getRegion()->getGamingFlags() & REGION_GAMING_HIDE_FIND_ALL)); + { + const LLViewerRegion* region(gAgent.getRegion()); + ctrl->setVisible(region && (region->getGamingFlags() & REGION_GAMING_PRESENT) && !(region->getGamingFlags() & REGION_GAMING_HIDE_FIND_ALL)); + } return TRUE; } diff --git a/indra/newview/llpaneldirgroups.cpp b/indra/newview/llpaneldirgroups.cpp index 6cdcdd538..bbd07ed2d 100644 --- a/indra/newview/llpaneldirgroups.cpp +++ b/indra/newview/llpaneldirgroups.cpp @@ -61,7 +61,8 @@ BOOL LLPanelDirGroups::postBuild() childDisable("Search"); setDefaultBtn( "Search" ); - childSetVisible("filter_gaming", (gAgent.getRegion()->getGamingFlags() & REGION_GAMING_PRESENT) && !(gAgent.getRegion()->getGamingFlags() & REGION_GAMING_HIDE_FIND_GROUPS)); + LLViewerRegion* region(gAgent.getRegion()); + getChildView("filter_gaming")->setVisible(region && (region->getGamingFlags() & REGION_GAMING_PRESENT) && !(region->getGamingFlags() & REGION_GAMING_HIDE_FIND_GROUPS)); return TRUE; } diff --git a/indra/newview/llpaneldirland.cpp b/indra/newview/llpaneldirland.cpp index 9c249a81d..ccb253111 100644 --- a/indra/newview/llpaneldirland.cpp +++ b/indra/newview/llpaneldirland.cpp @@ -126,7 +126,8 @@ BOOL LLPanelDirLand::postBuild() } } - childSetVisible("filter_gaming", (gAgent.getRegion()->getGamingFlags() & REGION_GAMING_PRESENT) && !(gAgent.getRegion()->getGamingFlags() & REGION_GAMING_HIDE_FIND_LAND)); + LLViewerRegion* region(gAgent.getRegion()); + getChildView("filter_gaming")->setVisible(region && (region->getGamingFlags() & REGION_GAMING_PRESENT) && !(region->getGamingFlags() & REGION_GAMING_HIDE_FIND_LAND)); return TRUE; } diff --git a/indra/newview/llpaneldirplaces.cpp b/indra/newview/llpaneldirplaces.cpp index 706d9013c..971d7f162 100644 --- a/indra/newview/llpaneldirplaces.cpp +++ b/indra/newview/llpaneldirplaces.cpp @@ -99,7 +99,8 @@ BOOL LLPanelDirPlaces::postBuild() childSetEnabled("Category", true); } - childSetVisible("filter_gaming", (gAgent.getRegion()->getGamingFlags() & REGION_GAMING_PRESENT) && !(gAgent.getRegion()->getGamingFlags() & REGION_GAMING_HIDE_FIND_SIMS)); + LLViewerRegion* region(gAgent.getRegion()); + getChildView("filter_gaming")->setVisible(region && (region->getGamingFlags() & REGION_GAMING_PRESENT) && !(region->getGamingFlags() & REGION_GAMING_HIDE_FIND_SIMS)); // Don't prepopulate the places list, as it hurts the database as of 2006-12-04. JC // initialQuery(); From aeeca6e2c00bd85c6bc57c1f908c923b2117b824 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Wed, 3 Sep 2014 01:45:47 -0500 Subject: [PATCH 13/34] llcommon.dll doer faster. (set /LTCG and /GL) --- indra/llcommon/CMakeLists.txt | 3 +++ indra/newview/CMakeLists.txt | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 8bc8553e3..79674c5a0 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -270,6 +270,9 @@ list(APPEND llcommon_SOURCE_FILES ${cwdebug_SOURCE_FILES}) list(APPEND llcommon_SOURCE_FILES ${llcommon_HEADER_FILES}) add_library (llcommon SHARED ${llcommon_SOURCE_FILES}) +if(WINDOWS) +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GL") +endif(WINDOWS) add_dependencies(llcommon prepare) target_link_libraries( llcommon diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 4668e2c97..cbe0737ae 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1880,7 +1880,7 @@ if (WINDOWS) set_target_properties(llcommon PROPERTIES - LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT" + LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT /LTCG" LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\"" ) From 56f2e20cb4e587a9a6068f0c181218de9656c6f0 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Wed, 3 Sep 2014 08:08:59 -0400 Subject: [PATCH 14/34] Feature Request: Add LiruResizeRootWithScreen to prevent ui getting messed up when the window is resized This is not complete, and it should only be used if you know what you're getting into. --- indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/llviewerwindow.cpp | 1 + 2 files changed, 12 insertions(+) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 8d90bea74..53871f51f 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -808,6 +808,17 @@ Value 1 + LiruResizeRootWithScreen + + Comment + When false, the ui view won't resize when the screen does (floaters won't move around without user interaction, but they also might be restricted from moving everywhere). + Persist + 1 + Type + Boolean + Value + 1 + LiruLegacyScrollToEnd Comment diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 099927c6d..5530628c9 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2399,6 +2399,7 @@ void LLViewerWindow::reshape(S32 width, S32 height) // Inform lower views of the change // round up when converting coordinates to make sure there are no gaps at edge of window LLView::sForceReshape = display_scale_changed; + if (/*display_scale_changed && */gSavedSettings.getBOOL("LiruResizeRootWithScreen")) // Singu Note: Nasty hack to keep floaters from repositioning on window resize. mRootView->reshape(llceil((F32)width / mDisplayScale.mV[VX]), llceil((F32)height / mDisplayScale.mV[VY])); LLView::sForceReshape = FALSE; From 95d6bec68f1cca763b747800fd0feeec21019c82 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Wed, 3 Sep 2014 08:11:19 -0400 Subject: [PATCH 15/34] Maximum bandwidth is apparently 10000 on SL Viewer, match that. --- .../skins/default/xui/en-us/panel_preferences_network.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml b/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml index a43e4c6dd..85bf46c48 100644 --- a/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml +++ b/indra/newview/skins/default/xui/en-us/panel_preferences_network.xml @@ -1,10 +1,10 @@ Maximum Bandwidth: - + kbps (kilobits per second) Texture Bandwidth: - + kbps (kilobits per second) Use HTTP for: From 3a372afc0e176c01518ce6ba47c6237779f7dc6b Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Wed, 3 Sep 2014 08:25:00 -0400 Subject: [PATCH 16/34] Add Render muted avatars check to System->Security & Privacy Preferences Redefaulted LiruLegacyDisplayMuteds to false due to (at least) two alpha testers noticing it and wanting it back how it is in the current release (since 1.7.0). True was to get back to the old ways of v1, but it's okay to be false by default, better now since it's exposed. Also irrelevant tiny voice cleanup from Spatters. --- indra/newview/app_settings/settings.xml | 2 +- indra/newview/llvoicevivox.cpp | 3 +-- .../default/xui/en-us/panel_preferences_ascent_system.xml | 3 ++- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 53871f51f..0ea26715c 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -762,7 +762,7 @@ Type Boolean Value - 1 + 0 LiruLegacyLandmarks diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 46edb4fa7..24be99f42 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -836,8 +836,7 @@ void LLVivoxVoiceClient::stateMachine() { // vivox executable exists. Build the command line and launch the daemon. std::string args, cmd; - // SLIM SDK: these arguments are no longer necessary. -// std::string args = " -p tcp -h -c"; + std::string loglevel = gSavedSettings.getString("VivoxDebugLevel"); if(loglevel.empty()) { diff --git a/indra/newview/skins/default/xui/en-us/panel_preferences_ascent_system.xml b/indra/newview/skins/default/xui/en-us/panel_preferences_ascent_system.xml index 3f0c796a6..55962a81f 100644 --- a/indra/newview/skins/default/xui/en-us/panel_preferences_ascent_system.xml +++ b/indra/newview/skins/default/xui/en-us/panel_preferences_ascent_system.xml @@ -99,6 +99,7 @@ + @@ -106,7 +107,7 @@ - + Drop a landmark below to autoteleport there in the last 20 seconds before region restarts Drop a backup landmark to autoteleport to below, should you already be at the above From f8520f9dd3f0e4dc62f8b1bb0fd312af5b3e85a6 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Wed, 3 Sep 2014 19:41:07 -0400 Subject: [PATCH 17/34] Em Dash wants build tools to focus properly when the build button is clicked. If the world is in focus and build button is pressed without the build floater open, don't bother focusing. If a floater is in focus and build button is pressed without the build floater open, focus the build floater If the build floater is in the background and the button is pressed, focus the build floater. If the build floater is in focus and the button is pressed, close the build floater. If the build floater is not in focus but nothing else is, close the build floater. --- indra/newview/lltoolmgr.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp index 92e525882..3fcfd88d4 100644 --- a/indra/newview/lltoolmgr.cpp +++ b/indra/newview/lltoolmgr.cpp @@ -330,6 +330,11 @@ void LLToolMgr::toggleBuildMode() // avoid spurious avatar movements LLViewerJoystick::getInstance()->setNeedsReset(); + if (gFocusMgr.getKeyboardFocus()) gFloaterTools->setFocus(true); // Focus isn't on the world, give it to the build tools. + } +.. else if (gFloaterTools->getVisible() && !gFloaterTools->hasFocus() && gFocusMgr.getKeyboardFocus()) // Build tools is open, but not the focused floater, give it focus. + { + gFloaterTools->setFocus(true); } else { From fa103a69f9e8f0b0073dcff8752f9f31d4f9df10 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Wed, 3 Sep 2014 21:49:08 -0400 Subject: [PATCH 18/34] I like jackals. --- indra/newview/lltoolmgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp index 3fcfd88d4..542256af0 100644 --- a/indra/newview/lltoolmgr.cpp +++ b/indra/newview/lltoolmgr.cpp @@ -332,7 +332,7 @@ void LLToolMgr::toggleBuildMode() if (gFocusMgr.getKeyboardFocus()) gFloaterTools->setFocus(true); // Focus isn't on the world, give it to the build tools. } -.. else if (gFloaterTools->getVisible() && !gFloaterTools->hasFocus() && gFocusMgr.getKeyboardFocus()) // Build tools is open, but not the focused floater, give it focus. + else if (gFloaterTools->getVisible() && !gFloaterTools->hasFocus() && gFocusMgr.getKeyboardFocus()) // Build tools is open, but not the focused floater, give it focus. { gFloaterTools->setFocus(true); } From 1608ed43c11166695f0065e64a3471dce511660b Mon Sep 17 00:00:00 2001 From: Shyotl Date: Thu, 4 Sep 2014 03:20:01 -0500 Subject: [PATCH 19/34] Release 1.8.6 --- indra/llcommon/llversionviewer.h.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llcommon/llversionviewer.h.in b/indra/llcommon/llversionviewer.h.in index 68949cee3..76d53b926 100644 --- a/indra/llcommon/llversionviewer.h.in +++ b/indra/llcommon/llversionviewer.h.in @@ -35,7 +35,7 @@ const S32 LL_VERSION_MAJOR = 1; const S32 LL_VERSION_MINOR = 8; -const S32 LL_VERSION_PATCH = 5; +const S32 LL_VERSION_PATCH = 6; const S32 LL_VERSION_BUILD = ${vBUILD}; const char * const LL_CHANNEL = "${VIEWER_CHANNEL}"; From 43a9aedf7d9a29a570f020c84b8e7b8ada337e6b Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Thu, 4 Sep 2014 17:23:23 -0400 Subject: [PATCH 20/34] Sync with Upstream Alchemy Changes LLEnvManagerNew::setRegionChangeCallback to LLAgent::addRegionChangedCallback Cleans up some of the timeout policies that aren't necessary any longer. Modernizes parts of LLViewerKeyboard, updates llregistry.h Begins changeover from LLDynamicArray to std::vector Minor merge of newer, trivial SSA functions. Introduces LLAgent functions: addParcelChangedCallback and canJoinGroups Support for secondlife:///app/appearance SLapps. Cleans up older functions. --- indra/llcommon/llregistry.h | 8 +- indra/llmessage/aihttptimeoutpolicy.cpp | 13 - indra/llwindow/llkeyboard.h | 3 +- .../newview/app_settings/settings_ascent.xml | 11 + indra/newview/hbfloatergrouptitles.cpp | 4 +- indra/newview/lfsimfeaturehandler.cpp | 3 +- indra/newview/llagent.cpp | 333 ++++++++---------- indra/newview/llagent.h | 60 +++- indra/newview/llappearancemgr.cpp | 246 +++++++------ indra/newview/llappearancemgr.h | 12 +- indra/newview/llappviewer.cpp | 3 - indra/newview/llenvmanager.cpp | 78 ++-- indra/newview/llenvmanager.h | 46 +-- indra/newview/llestateinfomodel.cpp | 34 +- indra/newview/llestateinfomodel.h | 25 +- indra/newview/llfloaterdirectory.cpp | 3 +- indra/newview/llfloatergroups.cpp | 10 +- indra/newview/llfloaterland.cpp | 51 ++- indra/newview/llfloaterlandholdings.cpp | 28 +- indra/newview/llfloaterpathfindingobjects.cpp | 27 +- indra/newview/llfloaterregiondebugconsole.cpp | 6 - indra/newview/llfloaterregioninfo.cpp | 100 ++++-- indra/newview/llfloaterregioninfo.h | 6 + indra/newview/llfloaterregionrestarting.cpp | 53 +-- indra/newview/llfloaterregionrestarting.h | 3 +- indra/newview/llgroupactions.cpp | 3 +- .../llmenuoptionpathfindingrebakenavmesh.cpp | 76 ++-- indra/newview/llmutelist.cpp | 3 +- indra/newview/llpanelavatar.cpp | 4 +- indra/newview/llpathfindingmanager.cpp | 191 +++++----- indra/newview/llpathfindingnavmesh.cpp | 3 +- indra/newview/llpathfindingnavmesh.h | 2 +- indra/newview/llstatusbar.cpp | 3 +- indra/newview/llviewerkeyboard.cpp | 152 ++++---- indra/newview/llviewerkeyboard.h | 8 +- indra/newview/llviewermenu.cpp | 2 +- indra/newview/llviewermessage.cpp | 3 +- indra/newview/llviewerregion.cpp | 4 + indra/newview/llvoavatar.cpp | 192 +++++----- indra/newview/llvoavatar.h | 11 +- indra/newview/llvoavatarself.cpp | 155 +++----- indra/newview/rlvhandler.cpp | 6 +- indra/newview/rlvui.cpp | 6 +- .../skins/default/xui/en-us/strings.xml | 4 + indra/newview/viewer_manifest.py | 12 +- 45 files changed, 1035 insertions(+), 971 deletions(-) diff --git a/indra/llcommon/llregistry.h b/indra/llcommon/llregistry.h index ca6d76a98..bb0d60247 100644 --- a/indra/llcommon/llregistry.h +++ b/indra/llcommon/llregistry.h @@ -307,8 +307,10 @@ public: virtual ~StaticRegistrar() {} StaticRegistrar(ref_const_key_t key, ref_const_value_t value) { - if(!singleton_t::instance().mStaticScope) - mStaticScope = new ScopedRegistrar(); + if (singleton_t::instance().exists(key)) + { + llerrs << "Duplicate registry entry under key \"" << key << "\"" << llendl; + } singleton_t::instance().mStaticScope->add(key, value); } }; @@ -338,7 +340,7 @@ protected: virtual void initSingleton() { - //mStaticScope = new ScopedRegistrar(); + mStaticScope = new ScopedRegistrar(); } virtual ~LLRegistrySingleton() diff --git a/indra/llmessage/aihttptimeoutpolicy.cpp b/indra/llmessage/aihttptimeoutpolicy.cpp index a37a9f916..4434ef545 100644 --- a/indra/llmessage/aihttptimeoutpolicy.cpp +++ b/indra/llmessage/aihttptimeoutpolicy.cpp @@ -905,12 +905,8 @@ AIHTTPTimeoutPolicy const* AIHTTPTimeoutPolicy::getTimeoutPolicyByName(std::stri #define P2(n, b) AIHTTPTimeoutPolicy n##_timeout(#n, b) // Policy name Policy -//P(accountingCostResponder); -P(agentStateResponder); -P(appearanceChangeMetricsResponder); P(assetUploadResponder); P(assetReportHandler); -P(asyncConsoleResponder); P(avatarPickerResponder); P(authHandler); P(avatarNameResponder); @@ -918,15 +914,11 @@ P2(baseCapabilitiesComplete, transfer_18s_connect_5s); P(blockingLLSDPost); P(blockingLLSDGet); P(blockingRawGet); -P(charactersResponder); -P(checkAgentAppearanceServiceResponder); P(classifiedStatsResponder); -P(consoleResponder); P(createInventoryCategoryResponder); P(emeraldDicDownloader); P(environmentApplyResponder); P(environmentRequestResponder); -P(estateChangeInfoResponder); P2(eventPollResponder, reply_60s); P(fetchInventoryResponder); P(fetchScriptLimitsAttachmentInfoResponder); @@ -960,12 +952,8 @@ P2(meshPhysicsShapeResponder, connect_30s); P2(meshSkinInfoResponder, connect_30s); P(mimeDiscoveryResponder); P(moderationResponder); -P(navMeshRebakeResponder); -P(navMeshResponder); -P(navMeshStatusResponder); P(newAgentInventoryVariablePriceResponder); P(objectCostResponder); -P(objectLinksetsResponder); P(physicsFlagsResponder); P(productInfoRequestResponder); P(regionResponder); @@ -977,7 +965,6 @@ P(setDisplayNameResponder); P2(simulatorFeaturesReceived, transfer_22s_connect_10s); P(startConferenceChatResponder); P2(startGroupVoteResponder, transfer_300s); -P(terrainLinksetsResponder); P(translationReceiver); P(uploadModelPremissionsResponder); P(userReportResponder); diff --git a/indra/llwindow/llkeyboard.h b/indra/llwindow/llkeyboard.h index 80ac3acfc..c2def259b 100644 --- a/indra/llwindow/llkeyboard.h +++ b/indra/llwindow/llkeyboard.h @@ -28,6 +28,7 @@ #define LL_LLKEYBOARD_H #include +#include #include "string_table.h" #include "lltimer.h" @@ -40,7 +41,7 @@ enum EKeystate KEYSTATE_UP }; -typedef void (*LLKeyFunc)(EKeystate keystate); +typedef boost::function LLKeyFunc; enum EKeyboardInsertMode { diff --git a/indra/newview/app_settings/settings_ascent.xml b/indra/newview/app_settings/settings_ascent.xml index 8be48da2d..f37e477d6 100644 --- a/indra/newview/app_settings/settings_ascent.xml +++ b/indra/newview/app_settings/settings_ascent.xml @@ -124,6 +124,17 @@ Value 0 + AlchemyRainbowEffects + + Comment + Makes agent effects rainbows! + Persist + 1 + Type + Boolean + Value + 0 + AlchemyRegionRestartShake Comment diff --git a/indra/newview/hbfloatergrouptitles.cpp b/indra/newview/hbfloatergrouptitles.cpp index c96189de1..5efb69118 100644 --- a/indra/newview/hbfloatergrouptitles.cpp +++ b/indra/newview/hbfloatergrouptitles.cpp @@ -162,7 +162,7 @@ void HBFloaterGroupTitles::onActivate(void* userdata) void update_titles_list(HBFloaterGroupTitles* self) { S32 i; - S32 count = gAgent.mGroups.count(); + S32 count = gAgent.mGroups.size(); LLUUID id; LLUUID highlight_id = LLUUID::null; LLUUID current_group_id = gAgent.getGroupID(); @@ -178,7 +178,7 @@ void update_titles_list(HBFloaterGroupTitles* self) for (i = 0; i < count; ++i) { - group_datap = &gAgent.mGroups.get(i); + group_datap = &gAgent.mGroups[i]; id = group_datap->mID; if (self->mFirstUse) { diff --git a/indra/newview/lfsimfeaturehandler.cpp b/indra/newview/lfsimfeaturehandler.cpp index 2e6b55b37..e06fe5891 100644 --- a/indra/newview/lfsimfeaturehandler.cpp +++ b/indra/newview/lfsimfeaturehandler.cpp @@ -20,7 +20,6 @@ #include "lfsimfeaturehandler.h" #include "llagent.h" -#include "llenvmanager.h" #include "llviewerregion.h" #include "hippogridmanager.h" @@ -33,7 +32,7 @@ LFSimFeatureHandler::LFSimFeatureHandler() , mWhisperRange(10) { if (!gHippoGridManager->getCurrentGrid()->isSecondLife()) // Remove this line if we ever handle SecondLife sim features - LLEnvManagerNew::instance().setRegionChangeCallback(boost::bind(&LFSimFeatureHandler::handleRegionChange, this)); + gAgent.addRegionChangedCallback(boost::bind(&LFSimFeatureHandler::handleRegionChange, this)); } ExportPolicy LFSimFeatureHandler::exportPolicy() const diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index cf5e3a3c8..013c45c14 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -103,6 +103,7 @@ #include "lluictrlfactory.h" //For LLUICtrlFactory::getLayeredXMLNode +#include "hippolimits.h" // for getMaxAgentGroups // [RLVa:KB] - Checked: 2011-11-04 (RLVa-1.4.4a) #include "rlvactions.h" #include "rlvhandler.h" @@ -246,6 +247,7 @@ protected: private: }; + //-------------------------------------------------------------------- // Statics // @@ -272,11 +274,10 @@ void LLAgentFriendObserver::changed(U32 mask) } } -// static -void LLAgent::parcelChangedCallback() + +void LLAgent::setCanEditParcel() // called via mParcelChangedSignal { bool can_edit = LLToolMgr::getInstance()->canEdit(); - gAgent.mCanEditParcel = can_edit; } @@ -435,6 +436,8 @@ LLAgent::LLAgent() : mControlsTakenCount[i] = 0; mControlsTakenPassedOnCount[i] = 0; } + + addParcelChangedCallback(&setCanEditParcel); } // Requires gSavedSettings to be initialized. @@ -444,10 +447,10 @@ LLAgent::LLAgent() : void LLAgent::init() { + // *Note: this is where LLViewerCamera::getInstance() used to be constructed. + setFlying( gSavedSettings.getBOOL("FlyingAtExit") ); - - // LLDebugVarMessageBox::show("Camera Lag", &CAMERA_FOCUS_HALF_LIFE, 0.5f, 0.01f); *mEffectColor = gSavedSettings.getColor4("EffectColor"); @@ -458,8 +461,6 @@ void LLAgent::init() mLastKnownRequestMaturity = mLastKnownResponseMaturity; mIsDoSendMaturityPreferenceToServer = true; - LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&LLAgent::parcelChangedCallback)); - if (!mTeleportFinishedSlot.connected()) { mTeleportFinishedSlot = LLViewerParcelMgr::getInstance()->setTeleportFinishedCallback(boost::bind(&LLAgent::handleTeleportFinished, this)); @@ -706,8 +707,7 @@ BOOL LLAgent::canFly() // static const LLCachedControl ascent_fly_always_enabled("AscentFlyAlwaysEnabled",false); - if(ascent_fly_always_enabled) - return TRUE; + if(ascent_fly_always_enabled) return TRUE; // LLViewerRegion* regionp = getRegion(); @@ -759,10 +759,7 @@ void LLAgent::setFlying(BOOL fly) if (fly) { // [RLVa:KB] - Checked: 2010-03-02 (RLVa-1.2.0d) | Modified: RLVa-1.0.0c - if (gRlvHandler.hasBehaviour(RLV_BHVR_FLY)) - { - return; - } + if (gRlvHandler.hasBehaviour(RLV_BHVR_FLY)) return; // [/RLVa:KB] BOOL was_flying = getFlying(); @@ -858,22 +855,30 @@ void LLAgent::handleServerBakeRegionTransition(const LLUUID& region_id) } } +void LLAgent::changeParcels() +{ + LL_DEBUGS("AgentLocation") << "Calling ParcelChanged callbacks" << LL_ENDL; + // Notify anything that wants to know about parcel changes + mParcelChangedSignal(); +} + +boost::signals2::connection LLAgent::addParcelChangedCallback(parcel_changed_callback_t cb) +{ + return mParcelChangedSignal.connect(cb); +} + //----------------------------------------------------------------------------- // setRegion() //----------------------------------------------------------------------------- void LLAgent::setRegion(LLViewerRegion *regionp) { - bool teleport = true; - llassert(regionp); if (mRegionp != regionp) { - // std::string host_name; - // host_name = regionp->getHost().getHostName(); std::string ip = regionp->getHost().getString(); - llinfos << "Moving agent into region: " << regionp->getName() - << " located at " << ip << llendl; + LL_INFOS("AgentLocation") << "Moving agent into region: " << regionp->getName() + << " located at " << ip << LL_ENDL; if (mRegionp) { // NaCl - Antispam Registry @@ -905,9 +910,6 @@ void LLAgent::setRegion(LLViewerRegion *regionp) { gSky.mVOGroundp->setRegion(regionp); } - - // Notify windlight managers - teleport = (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE); } else { @@ -929,6 +931,7 @@ void LLAgent::setRegion(LLViewerRegion *regionp) // Pass new region along to metrics components that care about this level of detail. LLAppViewer::metricsUpdateRegion(regionp->getHandle()); } + mRegionp = regionp; // Must shift hole-covering water object locations because local @@ -943,33 +946,18 @@ void LLAgent::setRegion(LLViewerRegion *regionp) LLSelectMgr::getInstance()->updateSelectionCenter(); - if (teleport) - { - LLEnvManagerNew::instance().onTeleport(); - } - else - { - LLEnvManagerNew::instance().onRegionCrossing(); - } - - // If the newly entered region is using server bakes, and our - // current appearance is non-baked, request appearance update from - // server. - if (mRegionp->capabilitiesReceived()) - { - handleServerBakeRegionTransition(mRegionp->getRegionID()); - } - else - { - // Need to handle via callback after caps arrive. - mRegionp->setCapabilitiesReceivedCallback(boost::bind(&LLAgent::handleServerBakeRegionTransition,this,_1)); - } + LL_DEBUGS("AgentLocation") << "Calling RegionChanged callbacks" << LL_ENDL; + mRegionChangedSignal(); } //----------------------------------------------------------------------------- // getRegion() //----------------------------------------------------------------------------- +LLViewerRegion *LLAgent::getRegion() const +{ + return mRegionp; +} const LLHost& LLAgent::getRegionHost() const { @@ -983,6 +971,16 @@ const LLHost& LLAgent::getRegionHost() const } } +boost::signals2::connection LLAgent::addRegionChangedCallback(const region_changed_signal_t::slot_type& cb) +{ + return mRegionChangedSignal.connect(cb); +} + +void LLAgent::removeRegionChangedCallback(boost::signals2::connection callback) +{ + mRegionChangedSignal.disconnect(callback); +} + //----------------------------------------------------------------------------- // inPrelude() //----------------------------------------------------------------------------- @@ -1906,12 +1904,6 @@ std::ostream& operator<<(std::ostream &s, const LLAgent &agent) return s; } - -// ------------------- Beginning of legacy LLCamera hack ---------------------- -// This section is included for legacy LLCamera support until -// it is no longer needed. Some legacy code must exist in -// non-legacy functions, and is labeled with "// legacy" comments. - // TRUE if your own avatar needs to be rendered. Usually only // in third person and build. //----------------------------------------------------------------------------- @@ -1950,8 +1942,8 @@ void LLAgent::startTyping() if (mChatTimer.getElapsedTimeF32() < 2.f) { - LLVOAvatar* chatter = gObjectList.findAvatar(mLastChatterID); - if (chatter) + LLViewerObject* chatter = gObjectList.findObject(mLastChatterID); + if (chatter && chatter->isAvatar()) { gAgentCamera.setLookAt(LOOKAT_TARGET_RESPOND, chatter, LLVector3::zero); } @@ -1961,7 +1953,8 @@ void LLAgent::startTyping() { sendAnimationRequest(ANIM_AGENT_TYPE, ANIM_REQUEST_START); } - gChatBar->sendChatFromViewer("", CHAT_TYPE_START, FALSE); + gChatBar-> + sendChatFromViewer("", CHAT_TYPE_START, FALSE); } //----------------------------------------------------------------------------- @@ -1973,7 +1966,8 @@ void LLAgent::stopTyping() { clearRenderState(AGENT_STATE_TYPING); sendAnimationRequest(ANIM_AGENT_TYPE, ANIM_REQUEST_STOP); - gChatBar->sendChatFromViewer("", CHAT_TYPE_STOP, FALSE); + gChatBar-> + sendChatFromViewer("", CHAT_TYPE_STOP, FALSE); } } @@ -2068,6 +2062,7 @@ void LLAgent::endAnimationUpdateUI() mViewsPushed = FALSE; } + gAgentCamera.setLookAt(LOOKAT_TARGET_CLEAR); if( gMorphView ) { @@ -2223,13 +2218,6 @@ void LLAgent::endAnimationUpdateUI() LLToolMgr::getInstance()->setCurrentToolset(gFaceEditToolset); LLFloaterMap::getInstance()->pushVisible(FALSE); - /* - LLView *view; - for (view = gFloaterView->getFirstChild(); view; view = gFloaterView->getNextChild()) - { - view->pushVisible(FALSE); - } - */ if( gMorphView ) { @@ -2567,28 +2555,30 @@ int LLAgent::convertTextToMaturity(char text) return LLAgentAccess::convertTextToMaturity(text); } -extern AIHTTPTimeoutPolicy maturityPreferences_timeout; class LLMaturityPreferencesResponder : public LLHTTPClient::ResponderWithResult { + LOG_CLASS(LLMaturityPreferencesResponder); public: LLMaturityPreferencesResponder(LLAgent *pAgent, U8 pPreferredMaturity, U8 pPreviousMaturity); virtual ~LLMaturityPreferencesResponder(); - /*virtual*/ void httpSuccess(void); - /*virtual*/ void httpFailure(void); +protected: + virtual void httpSuccess(); + virtual void httpFailure(); - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return maturityPreferences_timeout; } /*virtual*/ char const* getName(void) const { return "LLMaturityPreferencesResponder"; } +protected: private: - U8 parseMaturityFromServerResponse(const LLSD &pContent); + U8 parseMaturityFromServerResponse(const LLSD &pContent) const; LLAgent *mAgent; U8 mPreferredMaturity; U8 mPreviousMaturity; }; -LLMaturityPreferencesResponder::LLMaturityPreferencesResponder(LLAgent *pAgent, U8 pPreferredMaturity, U8 pPreviousMaturity) : +LLMaturityPreferencesResponder::LLMaturityPreferencesResponder(LLAgent *pAgent, U8 pPreferredMaturity, U8 pPreviousMaturity) + : mAgent(pAgent), mPreferredMaturity(pPreferredMaturity), mPreviousMaturity(pPreviousMaturity) @@ -2599,75 +2589,49 @@ LLMaturityPreferencesResponder::~LLMaturityPreferencesResponder() { } -void LLMaturityPreferencesResponder::httpSuccess(void) +void LLMaturityPreferencesResponder::httpSuccess() { - U8 actualMaturity = parseMaturityFromServerResponse(mContent); + U8 actualMaturity = parseMaturityFromServerResponse(getContent()); if (actualMaturity != mPreferredMaturity) { - llwarns << "while attempting to change maturity preference from '" << LLViewerRegion::accessToString(mPreviousMaturity) - << "' to '" << LLViewerRegion::accessToString(mPreferredMaturity) << "', the server responded with '" - << LLViewerRegion::accessToString(actualMaturity) << "' [value:" << static_cast(actualMaturity) << ", llsd:" - << mContent << "]" << llendl; + llwarns << "while attempting to change maturity preference from '" + << LLViewerRegion::accessToString(mPreviousMaturity) + << "' to '" << LLViewerRegion::accessToString(mPreferredMaturity) + << "', the server responded with '" + << LLViewerRegion::accessToString(actualMaturity) + << "' [value:" << static_cast(actualMaturity) + << "], " << dumpResponse() << llendl; } mAgent->handlePreferredMaturityResult(actualMaturity); } -void LLMaturityPreferencesResponder::httpFailure(void) +void LLMaturityPreferencesResponder::httpFailure() { - llwarns << "while attempting to change maturity preference from '" << LLViewerRegion::accessToString(mPreviousMaturity) - << "' to '" << LLViewerRegion::accessToString(mPreferredMaturity) << "', we got an error because '" - << mReason << "' [status:" << mStatus << "]" << llendl; + llwarns << "while attempting to change maturity preference from '" + << LLViewerRegion::accessToString(mPreviousMaturity) + << "' to '" << LLViewerRegion::accessToString(mPreferredMaturity) + << "', " << dumpResponse() << llendl; mAgent->handlePreferredMaturityError(); } -U8 LLMaturityPreferencesResponder::parseMaturityFromServerResponse(const LLSD &pContent) +U8 LLMaturityPreferencesResponder::parseMaturityFromServerResponse(const LLSD &pContent) const { - // stinson 05/24/2012 Pathfinding regions have re-defined the response behavior. In the old server code, - // if you attempted to change the preferred maturity to the same value, the response content would be an - // undefined LLSD block. In the new server code with pathfinding, the response content should always be - // defined. Thus, the check for isUndefined() can be replaced with an assert after pathfinding is merged - // into server trunk and fully deployed. U8 maturity = SIM_ACCESS_MIN; - if (pContent.isUndefined()) + + llassert(pContent.isDefined()); + llassert(pContent.isMap()); + llassert(pContent.has("access_prefs")); + llassert(pContent.get("access_prefs").isMap()); + llassert(pContent.get("access_prefs").has("max")); + llassert(pContent.get("access_prefs").get("max").isString()); + if (pContent.isDefined() && pContent.isMap() && pContent.has("access_prefs") + && pContent.get("access_prefs").isMap() && pContent.get("access_prefs").has("max") + && pContent.get("access_prefs").get("max").isString()) { - maturity = mPreferredMaturity; - } - else - { - llassert(!pContent.isUndefined()); - llassert(pContent.isMap()); - - if (!pContent.isUndefined() && pContent.isMap()) - { - // stinson 05/24/2012 Pathfinding regions have re-defined the response syntax. The if statement catches - // the new syntax, and the else statement catches the old syntax. After pathfinding is merged into - // server trunk and fully deployed, we can remove the else statement. - if (pContent.has("access_prefs")) - { - llassert(pContent.has("access_prefs")); - llassert(pContent.get("access_prefs").isMap()); - llassert(pContent.get("access_prefs").has("max")); - llassert(pContent.get("access_prefs").get("max").isString()); - if (pContent.get("access_prefs").isMap() && pContent.get("access_prefs").has("max") && - pContent.get("access_prefs").get("max").isString()) - { - LLSD::String actualPreference = pContent.get("access_prefs").get("max").asString(); - LLStringUtil::trim(actualPreference); - maturity = LLViewerRegion::shortStringToAccess(actualPreference); - } - } - else if (pContent.has("max")) - { - llassert(pContent.get("max").isString()); - if (pContent.get("max").isString()) - { - LLSD::String actualPreference = pContent.get("max").asString(); - LLStringUtil::trim(actualPreference); - maturity = LLViewerRegion::shortStringToAccess(actualPreference); - } - } - } + LLSD::String actualPreference = pContent.get("access_prefs").get("max").asString(); + LLStringUtil::trim(actualPreference); + maturity = LLViewerRegion::shortStringToAccess(actualPreference); } return maturity; @@ -2802,7 +2766,7 @@ void LLAgent::sendMaturityPreferenceToServer(U8 pPreferredMaturity) mLastKnownRequestMaturity = pPreferredMaturity; // Create a response handler - boost::intrusive_ptr responderPtr = new LLMaturityPreferencesResponder(this, pPreferredMaturity, mLastKnownResponseMaturity); + boost::intrusive_ptr responderPtr = boost::intrusive_ptr(new LLMaturityPreferencesResponder(this, pPreferredMaturity, mLastKnownResponseMaturity)); // If we don't have a region, report it as an error if (getRegion() == NULL) @@ -2817,7 +2781,8 @@ void LLAgent::sendMaturityPreferenceToServer(U8 pPreferredMaturity) // If the capability is not defined, report it as an error if (url.empty()) { - responderPtr->failureResult(0U, "capability 'UpdateAgentInformation' is not defined for region", LLSD()); + responderPtr->failureResult(0U, + "capability 'UpdateAgentInformation' is not defined for region", LLSD()); } else { @@ -2881,12 +2846,11 @@ void LLAgent::handleMaturity(const LLSD &pNewValue) sendMaturityPreferenceToServer(static_cast(pNewValue.asInteger())); } +//---------------------------------------------------------------------------- + void LLAgent::buildFullname(std::string& name) const { - if (isAgentAvatarValid()) - { - name = gAgentAvatarp->getFullname(); - } + if (isAgentAvatarValid()) name = gAgentAvatarp->getFullname(); } void LLAgent::buildFullnameAndTitle(std::string& name) const @@ -2912,10 +2876,10 @@ BOOL LLAgent::isInGroup(const LLUUID& group_id, BOOL ignore_god_mode /* FALSE */ if (!ignore_god_mode && isGodlike()) return true; - S32 count = mGroups.count(); - for(S32 i = 0; i < count; ++i) + U32 count = mGroups.size(); + for(U32 i = 0; i < count; ++i) { - if(mGroups.get(i).mID == group_id) + if(mGroups[i].mID == group_id) { return TRUE; } @@ -2932,12 +2896,12 @@ BOOL LLAgent::hasPowerInGroup(const LLUUID& group_id, U64 power) const // GP_NO_POWERS can also mean no power is enough to grant an ability. if (GP_NO_POWERS == power) return FALSE; - S32 count = mGroups.count(); - for(S32 i = 0; i < count; ++i) + U32 count = mGroups.size(); + for(U32 i = 0; i < count; ++i) { - if(mGroups.get(i).mID == group_id) + if(mGroups[i].mID == group_id) { - return (BOOL)((mGroups.get(i).mPowers & power) > 0); + return (BOOL)((mGroups[i].mPowers & power) > 0); } } return FALSE; @@ -2953,12 +2917,12 @@ U64 LLAgent::getPowerInGroup(const LLUUID& group_id) const if (isGodlike()) return GP_ALL_POWERS; - S32 count = mGroups.count(); - for(S32 i = 0; i < count; ++i) + U32 count = mGroups.size(); + for(U32 i = 0; i < count; ++i) { - if(mGroups.get(i).mID == group_id) + if(mGroups[i].mID == group_id) { - return (mGroups.get(i).mPowers); + return (mGroups[i].mPowers); } } @@ -2967,12 +2931,12 @@ U64 LLAgent::getPowerInGroup(const LLUUID& group_id) const BOOL LLAgent::getGroupData(const LLUUID& group_id, LLGroupData& data) const { - S32 count = mGroups.count(); + S32 count = mGroups.size(); for(S32 i = 0; i < count; ++i) { - if(mGroups.get(i).mID == group_id) + if(mGroups[i].mID == group_id) { - data = mGroups.get(i); + data = mGroups[i]; return TRUE; } } @@ -2981,12 +2945,12 @@ BOOL LLAgent::getGroupData(const LLUUID& group_id, LLGroupData& data) const S32 LLAgent::getGroupContribution(const LLUUID& group_id) const { - S32 count = mGroups.count(); + S32 count = mGroups.size(); for(S32 i = 0; i < count; ++i) { - if(mGroups.get(i).mID == group_id) + if(mGroups[i].mID == group_id) { - S32 contribution = mGroups.get(i).mContribution; + S32 contribution = mGroups[i].mContribution; return contribution; } } @@ -2995,12 +2959,12 @@ S32 LLAgent::getGroupContribution(const LLUUID& group_id) const BOOL LLAgent::setGroupContribution(const LLUUID& group_id, S32 contribution) { - S32 count = mGroups.count(); + S32 count = mGroups.size(); for(S32 i = 0; i < count; ++i) { - if(mGroups.get(i).mID == group_id) + if(mGroups[i].mID == group_id) { - mGroups.get(i).mContribution = contribution; + mGroups[i].mContribution = contribution; LLMessageSystem* msg = gMessageSystem; msg->newMessage("SetGroupContribution"); msg->nextBlock("AgentData"); @@ -3018,14 +2982,13 @@ BOOL LLAgent::setGroupContribution(const LLUUID& group_id, S32 contribution) BOOL LLAgent::setUserGroupFlags(const LLUUID& group_id, BOOL accept_notices, BOOL list_in_profile) { - S32 count = mGroups.count(); + S32 count = mGroups.size(); for(S32 i = 0; i < count; ++i) { - LLGroupData &group = mGroups.get(i); - if(group.mID == group_id) + if(mGroups[i].mID == group_id) { - group.mAcceptNotices = accept_notices; - group.mListInProfile = list_in_profile; + mGroups[i].mAcceptNotices = accept_notices; + mGroups[i].mListInProfile = list_in_profile; LLMessageSystem* msg = gMessageSystem; msg->newMessage("SetGroupAcceptNotices"); msg->nextBlock("AgentData"); @@ -3038,7 +3001,7 @@ BOOL LLAgent::setUserGroupFlags(const LLUUID& group_id, BOOL accept_notices, BOO msg->addBOOL("ListInProfile", list_in_profile); sendReliableMessage(); - update_group_floaters(group.mID); + update_group_floaters(mGroups[i].mID); return TRUE; } @@ -3046,6 +3009,10 @@ BOOL LLAgent::setUserGroupFlags(const LLUUID& group_id, BOOL accept_notices, BOO return FALSE; } +BOOL LLAgent::canJoinGroups() const +{ + return (S32)mGroups.size() < gHippoLimits->getMaxAgentGroups(); +} LLQuaternion LLAgent::getHeadRotation() { @@ -3173,7 +3140,7 @@ void LLAgent::sendRevokePermissions(const LLUUID & target, U32 permissions) msg->nextBlockFast(_PREHASH_Data); msg->addUUIDFast(_PREHASH_ObjectID, target); // Must be in the region - msg->addU32Fast(_PREHASH_ObjectPermissions, permissions); + msg->addS32Fast(_PREHASH_ObjectPermissions, (S32) permissions); sendReliableMessage(); } @@ -3312,9 +3279,19 @@ void LLAgent::getName(std::string& name) } } -const LLColor4 &LLAgent::getEffectColor() +const LLColor4 LLAgent::getEffectColor() { - return *mEffectColor; + LLColor4 effect_color = *mEffectColor; + + // Rainbow Particle Effects + static LLCachedControl AlchemyRainbowEffects(gSavedSettings, "AlchemyRainbowEffects"); + if(AlchemyRainbowEffects) + { + LLColor3 rainbow; + rainbow.setHSL(fmodf((F32)LLFrameTimer::getElapsedSeconds()/4.f, 1.f), 1.f, 0.5f); + effect_color.set(rainbow, 1.0f); + } + return effect_color; } void LLAgent::setEffectColor(const LLColor4 &color) @@ -3364,6 +3341,7 @@ BOOL LLAgent::downGrabbed() const void update_group_floaters(const LLUUID& group_id) { + LLGroupActions::refresh(group_id); // update avatar info @@ -3394,10 +3372,10 @@ void LLAgent::processAgentDropGroup(LLMessageSystem *msg, void **) // Remove the group if it already exists remove it and add the new data to pick up changes. LLGroupData gd; gd.mID = group_id; - S32 index = gAgent.mGroups.find(gd); - if (index != -1) + std::vector::iterator found_it = std::find(gAgent.mGroups.begin(), gAgent.mGroups.end(), gd); + if (found_it != gAgent.mGroups.end()) { - gAgent.mGroups.remove(index); + gAgent.mGroups.erase(found_it); if (gAgent.getGroupID() == group_id) { gAgent.mGroupID.setNull(); @@ -3434,8 +3412,7 @@ class LLAgentDropGroupViewerNode : public LLHTTPNode !input.has("body") ) { //what to do with badly formed message? - response->statusUnknownError(400); - response->result(LLSD("Invalid message parameters")); + response->extendedResult(HTTP_BAD_REQUEST, "", LLSD("Invalid message parameters")); } LLSD body = input["body"]; @@ -3473,10 +3450,10 @@ class LLAgentDropGroupViewerNode : public LLHTTPNode // and add the new data to pick up changes. LLGroupData gd; gd.mID = group_id; - S32 index = gAgent.mGroups.find(gd); - if (index != -1) + std::vector::iterator found_it = std::find(gAgent.mGroups.begin(), gAgent.mGroups.end(), gd); + if (found_it != gAgent.mGroups.end()) { - gAgent.mGroups.remove(index); + gAgent.mGroups.erase(found_it); if (gAgent.getGroupID() == group_id) { gAgent.mGroupID.setNull(); @@ -3507,8 +3484,7 @@ class LLAgentDropGroupViewerNode : public LLHTTPNode else { //what to do with badly formed message? - response->statusUnknownError(400); - response->result(LLSD("Invalid message parameters")); + response->extendedResult(HTTP_BAD_REQUEST, "", LLSD("Invalid message parameters")); } } }; @@ -3532,7 +3508,6 @@ void LLAgent::processAgentGroupDataUpdate(LLMessageSystem *msg, void **) S32 count = msg->getNumberOfBlocksFast(_PREHASH_GroupData); LLGroupData group; - S32 index = -1; bool need_floater_update = false; for(S32 i = 0; i < count; ++i) { @@ -3547,12 +3522,12 @@ void LLAgent::processAgentGroupDataUpdate(LLMessageSystem *msg, void **) { need_floater_update = true; // Remove the group if it already exists remove it and add the new data to pick up changes. - index = gAgent.mGroups.find(group); - if (index != -1) + std::vector::iterator found_it = std::find(gAgent.mGroups.begin(), gAgent.mGroups.end(), group); + if (found_it != gAgent.mGroups.end()) { - gAgent.mGroups.remove(index); + gAgent.mGroups.erase(found_it); } - gAgent.mGroups.put(group); + gAgent.mGroups.push_back(group); } if (need_floater_update) { @@ -3591,7 +3566,6 @@ class LLAgentGroupDataUpdateViewerNode : public LLHTTPNode { LLGroupData group; - S32 index = -1; bool need_floater_update = false; group.mID = (*iter_group)["GroupID"].asUUID(); @@ -3608,12 +3582,12 @@ class LLAgentGroupDataUpdateViewerNode : public LLHTTPNode { need_floater_update = true; // Remove the group if it already exists remove it and add the new data to pick up changes. - index = gAgent.mGroups.find(group); - if (index != -1) + std::vector::iterator found_it = std::find(gAgent.mGroups.begin(), gAgent.mGroups.end(), group); + if (found_it != gAgent.mGroups.end()) { - gAgent.mGroups.remove(index); + gAgent.mGroups.erase(found_it); } - gAgent.mGroups.put(group); + gAgent.mGroups.push_back(group); } if (need_floater_update) { @@ -3692,12 +3666,9 @@ void LLAgent::processScriptControlChange(LLMessageSystem *msg, void **) total_count++; } } - + // Any control taken? If so, might be first time. - if (total_count > 0) - { - LLFirstUse::useOverrideKeys(); - } + if (total_count > 0) LLFirstUse::useOverrideKeys(); } else { @@ -3813,7 +3784,7 @@ void LLAgent::processAgentCachedTextureResponse(LLMessageSystem *mesgsys, void * return; } - if (isAgentAvatarValid() && gAgentAvatarp->isEditingAppearance()) + if (gAgentAvatarp->isEditingAppearance()) { // ignore baked textures when in customize mode return; diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index a66b375f4..6294d2e0a 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -36,7 +36,6 @@ #include #include "indra_constants.h" - #include "llevent.h" // LLObservable base class #include "llagentconstants.h" #include "llagentdata.h" // gAgentID, gAgentSessionID @@ -72,9 +71,12 @@ class LLSLURL; class LLSimInfo; class LLTeleportRequest; -typedef std::vector llvo_vec_t; typedef boost::shared_ptr LLTeleportRequestPtr; +//-------------------------------------------------------------------- +// Types +//-------------------------------------------------------------------- + enum EAnimRequest { ANIM_REQUEST_START, @@ -213,7 +215,7 @@ public: //-------------------------------------------------------------------- public: const LLCoordFrame& getFrameAgent() const { return mFrameAgent; } - void initOriginGlobal(const LLVector3d &origin_global); // Only to be used in ONE place! - djs 08/07/02 + void initOriginGlobal(const LLVector3d &origin_global); // Only to be used in ONE place void resetAxes(); void resetAxes(const LLVector3 &look_at); // Makes reasonable left and up // The following three get*Axis functions return direction avatar is looking, not camera. @@ -238,15 +240,52 @@ private: U64 mHomeRegionHandle; LLVector3 mHomePosRegion; + //-------------------------------------------------------------------- + // Parcel + //-------------------------------------------------------------------- +public: + void changeParcels(); // called by LLViewerParcelMgr when we cross a parcel boundary + + // Register a boost callback to be called when the agent changes parcels + typedef boost::function parcel_changed_callback_t; + boost::signals2::connection addParcelChangedCallback(parcel_changed_callback_t); + +private: + typedef boost::signals2::signal parcel_changed_signal_t; + parcel_changed_signal_t mParcelChangedSignal; + //-------------------------------------------------------------------- // Region //-------------------------------------------------------------------- public: void setRegion(LLViewerRegion *regionp); - LLViewerRegion *getRegion() const { return mRegionp; } + LLViewerRegion *getRegion() const; const LLHost& getRegionHost() const; BOOL inPrelude(); + /** + * Register a boost callback to be called when the agent changes regions + * Note that if you need to access a capability for the region, you may need to wait + * for the capabilities to be received, since in some cases your region changed + * callback will be called before the capabilities have been received. Your callback + * may need to look something like: + * + * LLViewerRegion* region = gAgent.getRegion(); + * if (region->capabilitiesReceived()) + * { + * useCapability(region); + * } + * else // Need to handle via callback after caps arrive. + * { + * region->setCapabilitiesReceivedCallback(boost::bind(&useCapability,region,_1)); + * // you may or may not want to remove that callback + * } + */ + typedef boost::signals2::signal region_changed_signal_t; + + boost::signals2::connection addRegionChangedCallback(const region_changed_signal_t::slot_type& cb); + void removeRegionChangedCallback(boost::signals2::connection callback); + // struct SHLureRequest { @@ -260,9 +299,10 @@ public: void showLureDestination(const std::string fromname, U64& handle, U32 x, U32 y, U32 z); void onFoundLureDestination(LLSimInfo *siminfo = NULL); // - + private: LLViewerRegion *mRegionp; + region_changed_signal_t mRegionChangedSignal; //-------------------------------------------------------------------- // History @@ -274,6 +314,7 @@ public: const LLVector3d &getLastPositionGlobal() const { return mLastPositionGlobal; } void setLastPositionGlobal(const LLVector3d &pos) { mLastPositionGlobal = pos; } + private: std::set mRegionsVisited; // Stat - what distinct regions has the avatar been to? F64 mDistanceTraveled; // Stat - how far has the avatar moved? @@ -654,6 +695,7 @@ private: void handleTeleportFinished(); void handleTeleportFailed(); +public: void handleServerBakeRegionTransition(const LLUUID& region_id); //-------------------------------------------------------------------- @@ -682,9 +724,10 @@ private: public: bool canEditParcel() const { return mCanEditParcel; } private: + static void setCanEditParcel(); bool mCanEditParcel; - static void parcelChangedCallback(); + /******************************************************************************** ** ** @@ -807,7 +850,7 @@ private: // HUD //-------------------------------------------------------------------- public: - const LLColor4 &getEffectColor(); + const LLColor4 getEffectColor(); void setEffectColor(const LLColor4 &color); private: LLColor4 *mEffectColor; @@ -831,6 +874,7 @@ public: BOOL setGroupContribution(const LLUUID& group_id, S32 contribution); BOOL setUserGroupFlags(const LLUUID& group_id, BOOL accept_notices, BOOL list_in_profile); const std::string &getGroupName() const { return mGroupName; } + BOOL canJoinGroups() const; private: std::string mGroupName; LLUUID mGroupID; @@ -845,7 +889,7 @@ protected: // Only used for building titles. BOOL isGroupMember() const { return !mGroupID.isNull(); } public: - LLDynamicArray mGroups; + std::vector mGroups; //-------------------------------------------------------------------- // Group Title diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 6294e62af..bffaafd3c 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -113,7 +113,7 @@ public: }; // support for secondlife:///app/appearance SLapps -/*class LLAppearanceHandler : public LLCommandHandler +class LLAppearanceHandler : public LLCommandHandler { public: // requests will be throttled from a non-trusted browser @@ -121,6 +121,7 @@ public: bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web) { + /* Singu Note: Nopenopenope. // support secondlife:///app/appearance/show, but for now we just // make all secondlife:///app/appearance SLapps behave this way if (!LLUI::sSettingGroups["config"]->getBOOL("EnableAppearance")) @@ -128,13 +129,14 @@ public: LLNotificationsUtil::add("NoAppearance", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit")); return true; } + */ - LLFloaterSidePanelContainer::showPanel("appearance", LLSD()); + LLFloaterCustomize::getInstance()->open(); return true; } }; -LLAppearanceHandler gAppearanceHandler;*/ +LLAppearanceHandler gAppearanceHandler; LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id, const std::string& name) @@ -147,11 +149,11 @@ LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id, const std::string item_array, LLInventoryModel::EXCLUDE_TRASH, has_name); - if (0 == cat_array.count()) + if (0 == cat_array.size()) return LLUUID(); else { - LLViewerInventoryCategory *cat = cat_array.get(0); + LLViewerInventoryCategory *cat = cat_array.at(0); if (cat) return cat->getUUID(); else @@ -215,11 +217,10 @@ public: // Request or re-request operation for specified item. void addItem(const LLUUID& item_id) { - LL_DEBUGS("Avatar") << "item_id " << item_id << llendl; - + LL_DEBUGS("Avatar") << "item_id " << item_id << LL_ENDL; if (!requestOperation(item_id)) { - LL_DEBUGS("Avatar") << "item_id " << item_id << " requestOperation false, skipping" << llendl; + LL_DEBUGS("Avatar") << "item_id " << item_id << " requestOperation false, skipping" << LL_ENDL; return; } @@ -249,7 +250,7 @@ public: } mPendingRequests--; F32 elapsed = timestamp.getElapsedTimeF32(); - LL_DEBUGS("Avatar") << "op done, src_id " << src_id << " dst_id " << dst_id << " after " << elapsed << " seconds" << llendl; + LL_DEBUGS("Avatar") << "op done, src_id " << src_id << " dst_id " << dst_id << " after " << elapsed << " seconds" << LL_ENDL; if (mWaitTimes.find(src_id) == mWaitTimes.end()) { // No longer waiting for this item - either serviced @@ -353,16 +354,16 @@ public: void reportStats() { - LL_DEBUGS("Avatar") << "Phase: " << mTrackingPhase << llendl; - LL_DEBUGS("Avatar") << "mFailCount: " << mFailCount << llendl; - LL_DEBUGS("Avatar") << "mRetryCount: " << mRetryCount << llendl; - LL_DEBUGS("Avatar") << "Times: n " << mTimeStats.getCount() << " min " << mTimeStats.getMinValue() << " max " << mTimeStats.getMaxValue() << llendl; - LL_DEBUGS("Avatar") << "Mean " << mTimeStats.getMean() << " stddev " << mTimeStats.getStdDev() << llendl; + LL_DEBUGS("Avatar") << "Phase: " << mTrackingPhase << LL_ENDL; + LL_DEBUGS("Avatar") << "mFailCount: " << mFailCount << LL_ENDL; + LL_DEBUGS("Avatar") << "mRetryCount: " << mRetryCount << LL_ENDL; + LL_DEBUGS("Avatar") << "Times: n " << mTimeStats.getCount() << " min " << mTimeStats.getMinValue() << " max " << mTimeStats.getMaxValue() << LL_ENDL; + LL_DEBUGS("Avatar") << "Mean " << mTimeStats.getMean() << " stddev " << mTimeStats.getStdDev() << LL_ENDL; } virtual ~LLCallAfterInventoryBatchMgr() { - LL_DEBUGS("Avatar") << "deleting" << llendl; + LL_DEBUGS("Avatar") << "deleting" << LL_ENDL; } protected: @@ -395,16 +396,22 @@ public: LLCallAfterInventoryBatchMgr(dst_cat_id, phase_name, on_completion_func, on_failure_func, retry_after, max_retries) { addItems(src_items); + sInstanceCount++; + } + + ~LLCallAfterInventoryCopyMgr() + { + sInstanceCount--; } virtual bool requestOperation(const LLUUID& item_id) { LLViewerInventoryItem *item = gInventory.getItem(item_id); llassert(item); - LL_DEBUGS("Avatar") << "copying item " << item_id << llendl; + LL_DEBUGS("Avatar") << "copying item " << item_id << LL_ENDL; if (ll_frand() < gSavedSettings.getF32("InventoryDebugSimulateOpFailureRate")) { - LL_DEBUGS("Avatar") << "simulating failure by not sending request for item " << item_id << llendl; + LL_DEBUGS("Avatar") << "simulating failure by not sending request for item " << item_id << LL_ENDL; return true; } copy_inventory_item( @@ -417,8 +424,15 @@ public: ); return true; } + + static S32 getInstanceCount() { return sInstanceCount; } + +private: + static S32 sInstanceCount; }; +S32 LLCallAfterInventoryCopyMgr::sInstanceCount = 0; + class LLCallAfterInventoryLinkMgr: public LLCallAfterInventoryBatchMgr { public: @@ -2635,6 +2649,11 @@ void LLAppearanceMgr::wearInventoryCategory(LLInventoryCategory* category, bool category->getUUID(), copy, append)); } +S32 LLAppearanceMgr::getActiveCopyOperations() const +{ + return LLCallAfterInventoryCopyMgr::getInstanceCount(); +} + void LLAppearanceMgr::wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool append) { LL_INFOS("Avatar") << self_av_string() << "starting" << LL_ENDL; @@ -2733,6 +2752,7 @@ void LLAppearanceMgr::wearInventoryCategoryOnAvatar( LLInventoryCategory* catego LLAppearanceMgr::changeOutfit(TRUE, category->getUUID(), append); } +// FIXME do we really want to search entire inventory for matching name? void LLAppearanceMgr::wearOutfitByName(const std::string& name) { LL_INFOS("Avatar") << self_av_string() << "Wearing category " << name << LL_ENDL; @@ -2747,10 +2767,10 @@ void LLAppearanceMgr::wearOutfitByName(const std::string& name) has_name); bool copy_items = false; LLInventoryCategory* cat = NULL; - if (cat_array.count() > 0) + if (cat_array.size() > 0) { // Just wear the first one that matches - cat = cat_array.get(0); + cat = cat_array.at(0); } else { @@ -2759,9 +2779,9 @@ void LLAppearanceMgr::wearOutfitByName(const std::string& name) item_array, LLInventoryModel::EXCLUDE_TRASH, has_name); - if(cat_array.count() > 0) + if(cat_array.size() > 0) { - cat = cat_array.get(0); + cat = cat_array.at(0); copy_items = true; } } @@ -2775,8 +2795,6 @@ void LLAppearanceMgr::wearOutfitByName(const std::string& name) llwarns << "Couldn't find outfit " <getWearableType(); const bool is_body_part = (wearable_type == LLWearableType::WT_SHAPE) @@ -2958,18 +2976,24 @@ LLInventoryModel::item_array_t LLAppearanceMgr::findCOFItemLinks(const LLUUID& i cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH); - for (S32 i=0; igetLinkedUUID() == vitem->getLinkedUUID()) { - result.put(item_array.get(i)); + result.push_back(item_array.at(i)); } } } return result; } +bool LLAppearanceMgr::isLinkedInCOF(const LLUUID& item_id) +{ + LLInventoryModel::item_array_t links = LLAppearanceMgr::instance().findCOFItemLinks(item_id); + return links.size() > 0; +} + void LLAppearanceMgr::removeAllClothesFromAvatar() { // Fetch worn clothes (i.e. the ones in COF). @@ -3035,27 +3059,13 @@ void LLAppearanceMgr::removeCOFItemLinks(const LLUUID& item_id) cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH); - for (S32 i=0; igetIsLinkType() && item->getLinkedUUID() == item_id) { -#if 0 // LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG - // NOTE-RLVa: debug-only, can be removed down the line - if (rlv_handler_t::isEnabled()) - { - RLV_ASSERT(rlvPredCanRemoveItem(item)); - } -#endif // LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG gInventory.purgeObject(item->getUUID()); } -// [/RLVa:KB] -// const LLInventoryItem* item = item_array.get(i).get(); -// if (item->getIsLinkType() && item->getLinkedUUID() == item_id) -// { -// gInventory.purgeObject(item->getUUID()); -// } } } @@ -3072,16 +3082,6 @@ void LLAppearanceMgr::removeCOFLinksOfType(LLWearableType::EType type) const LLViewerInventoryItem* item = *it; if (item->getIsLinkType()) // we must operate on links only { -// [RLVa:KB] - Checked: 2013-02-12 (RLVa-1.4.8) -#if 0 // LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG - // NOTE-RLVa: debug-only, can be removed down the line - if (rlv_handler_t::isEnabled()) - { - RLV_ASSERT(rlvPredCanRemoveItem(item)); - } -#endif // LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG -// [/RLVa:KB] - gInventory.purgeObject(item->getUUID()); } } @@ -3091,7 +3091,7 @@ bool sort_by_linked_uuid(const LLViewerInventoryItem* item1, const LLViewerInven { if (!item1 || !item2) { - llwarning("item1, item2 cannot be null, something is very wrong", 0); + llwarns << "item1, item2 cannot be null, something is very wrong" << llendl; return true; } @@ -3133,8 +3133,9 @@ void LLAppearanceMgr::updateIsDirty() gInventory.collectDescendentsIf(base_outfit, outfit_cats, outfit_items, LLInventoryModel::EXCLUDE_TRASH, collector); - if(outfit_items.count() != cof_items.count()) + if(outfit_items.size() != cof_items.size()) { + LL_DEBUGS("Avatar") << "item count different - base " << outfit_items.size() << " cof " << cof_items.size() << LL_ENDL; // Current outfit folder should have one more item than the outfit folder. // this one item is the link back to the outfit folder itself. mOutfitIsDirty = true; @@ -3147,18 +3148,37 @@ void LLAppearanceMgr::updateIsDirty() for (U32 i = 0; i < cof_items.size(); ++i) { - LLViewerInventoryItem *item1 = cof_items.get(i); - LLViewerInventoryItem *item2 = outfit_items.get(i); + LLViewerInventoryItem *item1 = cof_items.at(i); + LLViewerInventoryItem *item2 = outfit_items.at(i); if (item1->getLinkedUUID() != item2->getLinkedUUID() || item1->getName() != item2->getName() || item1->getActualDescription() != item2->getActualDescription()) { + if (item1->getLinkedUUID() != item2->getLinkedUUID()) + { + LL_DEBUGS("Avatar") << "link id different " << LL_ENDL; + } + else + { + if (item1->getName() != item2->getName()) + { + LL_DEBUGS("Avatar") << "name different " << item1->getName() << " " << item2->getName() << LL_ENDL; + } + if (item1->getActualDescription() != item2->getActualDescription()) + { + LL_DEBUGS("Avatar") << "desc different " << item1->getActualDescription() + << " " << item2->getActualDescription() + << " names " << item1->getName() << " " << item2->getName() << LL_ENDL; + } + } mOutfitIsDirty = true; return; } } } + llassert(!mOutfitIsDirty); + LL_DEBUGS("Avatar") << "clean" << LL_ENDL; } // *HACK: Must match name in Library or agent inventory @@ -3240,23 +3260,6 @@ void LLAppearanceMgr::copyLibraryGestures() } } -void LLAppearanceMgr::autopopulateOutfits() -{ - // If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account) - // then auto-populate outfits from the library into the My Outfits folder. - - LL_INFOS("Avatar") << self_av_string() << "avatar fully visible" << LL_ENDL; - - static bool check_populate_my_outfits = true; - if (check_populate_my_outfits && - (LLInventoryModel::getIsFirstTimeInViewer2() - || gSavedSettings.getBOOL("MyOutfitsAutofill"))) - { - gAgentWearables.populateMyOutfitsFolder(); - } - check_populate_my_outfits = false; -} - // Handler for anything that's deferred until avatar de-clouds. void LLAppearanceMgr::onFirstFullyVisible() { @@ -3264,10 +3267,6 @@ void LLAppearanceMgr::onFirstFullyVisible() gAgentAvatarp->reportAvatarRezTime(); gAgentAvatarp->debugAvatarVisible(); - // The auto-populate is failing at the point of generating outfits - // folders, so don't do the library copy until that is resolved. - // autopopulateOutfits(); - // If this is the first time we've ever logged in, // then copy default gestures from the library. if (gAgent.isFirstLogin()) { @@ -3293,6 +3292,7 @@ bool LLAppearanceMgr::updateBaseOutfit() llassert(!isOutfitLocked()); return false; } + setOutfitLocked(true); gAgentWearables.notifyLoadingStarted(); @@ -3319,12 +3319,12 @@ void LLAppearanceMgr::divvyWearablesByType(const LLInventoryModel::item_array_t& items_by_type.resize(LLWearableType::WT_COUNT); if (items.empty()) return; - for (S32 i=0; igetActualDescription(); const std::string& desc2 = item2->getActualDescription(); @@ -3376,8 +3370,10 @@ struct WearablesOrderComparator //items with ordering information but not for the associated wearables type if (!item1_valid && item2_valid) return false; + else if (item1_valid && !item2_valid) + return true; - return true; + return item1->getName() < item2->getName(); } U32 mControlSize; @@ -3408,7 +3404,6 @@ void LLAppearanceMgr::updateClothingOrderingInfo(LLUUID cat_id, bool update_base bool inventory_changed = false; for (U32 type = LLWearableType::WT_SHIRT; type < LLWearableType::WT_COUNT; type++) { - U32 size = items_by_type[type].size(); if (!size) continue; @@ -3428,7 +3423,7 @@ void LLAppearanceMgr::updateClothingOrderingInfo(LLUUID cat_id, bool update_base item->setComplete(TRUE); item->updateServer(FALSE); gInventory.updateItem(item); - + inventory_changed = true; } } @@ -3496,31 +3491,16 @@ class RequestAgentUpdateAppearanceResponder: public LLHTTPClient::ResponderWithR { public: virtual AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return requestAgentUpdateAppearance_timeout; } - RequestAgentUpdateAppearanceResponder() - { - mRetryPolicy = new LLAdaptiveRetryPolicy(1.0, 32.0, 2.0, 10); - } + RequestAgentUpdateAppearanceResponder(); - virtual ~RequestAgentUpdateAppearanceResponder() - { - } + virtual ~RequestAgentUpdateAppearanceResponder(); +protected: // Successful completion. - /* virtual */ void httpSuccess(void) - { - LL_DEBUGS("Avatar") << "content: " << ll_pretty_print_sd(mContent) << LL_ENDL; - if (mContent["success"].asBoolean()) - { - LL_DEBUGS("Avatar") << "OK" << LL_ENDL; - } - else - { - onFailure(200); - } - } + /* virtual */ void httpSuccess(); // Error - /*virtual*/ void httpFailure(void) + /*virtual*/ void httpFailure() { llwarns << "appearance update request failed, " << dumpResponse() << llendl; onFailure(mStatus); @@ -3548,6 +3528,15 @@ public: /*virtual*/ char const* getName(void) const { return "RequestAgentUpdateAppearanceResponder"; } }; +RequestAgentUpdateAppearanceResponder::RequestAgentUpdateAppearanceResponder() +{ + mRetryPolicy = new LLAdaptiveRetryPolicy(1.0, 32.0, 2.0, 10); +} + +RequestAgentUpdateAppearanceResponder::~RequestAgentUpdateAppearanceResponder() +{ +} + void LLAppearanceMgr::requestServerAppearanceUpdate(LLHTTPClient::ResponderPtr responder_ptr) { if (gAgentAvatarp->isEditingAppearance()) @@ -3638,6 +3627,41 @@ void scroll_to_folder(const LLUUID& folder_id) } } +/* virtual */ void RequestAgentUpdateAppearanceResponder::httpSuccess() +{ + const LLSD& content = getContent(); + if (!content.isMap()) + { + failureResult(400, "Malformed response contents", content); + return; + } + if (content["success"].asBoolean()) + { + LL_DEBUGS("Avatar") << "succeeded" << LL_ENDL; + static LLCachedControl debug_ava_appr_msg(gSavedSettings, "DebugAvatarAppearanceMessage"); + if (debug_ava_appr_msg) + { + dump_sequential_xml(gAgentAvatarp->getFullname() + "_appearance_request_ok", content); + } + + //onSuccess(); + } + else + { + failureResult(400, "Non-success response", content); + } +} + +std::string LLAppearanceMgr::getAppearanceServiceURL() const +{ + if (gSavedSettings.getString("AgentAppearanceServiceURL").empty()) + { + return mAppearanceServiceURL; + } + return gSavedSettings.getString("AgentAppearanceServiceURL"); // Singu TODO: Use "DebugAvatarAppearanceServiceURLOverride" +} + + class LLBoostFuncInventoryCallbackFireOnce : public LLBoostFuncInventoryCallback { public: diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index b3539de66..887e7991a 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -78,6 +78,8 @@ public: LLInventoryModel::item_array_t& items_to_kill); void enforceItemRestrictions(); + S32 getActiveCopyOperations() const; + // Copy all items and the src category itself. void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id, LLPointer cb); @@ -153,6 +155,7 @@ public: // Find COF entries referencing the given item. LLInventoryModel::item_array_t findCOFItemLinks(const LLUUID& item_id); + bool isLinkedInCOF(const LLUUID& item_id); // Remove COF entries void removeCOFItemLinks(const LLUUID& item_id); @@ -213,6 +216,13 @@ public: void requestServerAppearanceUpdate(LLHTTPClient::ResponderPtr responder_ptr = NULL); + void setAppearanceServiceURL(const std::string& url) { mAppearanceServiceURL = url; } + std::string getAppearanceServiceURL() const; + +private: + std::string mAppearanceServiceURL; + + protected: LLAppearanceMgr(); ~LLAppearanceMgr(); @@ -255,7 +265,7 @@ private: */ bool mOutfitLocked; - std::auto_ptr mUnlockOutfitTimer; + boost::scoped_ptr mUnlockOutfitTimer; // [SL:KB] - Patch: Appearance-SyncAttach | Checked: 2010-09-18 (Catznip-3.0.0a) | Modified: Catznip-2.1.2e public: diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index caf66d6bc..50212e1c4 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -881,9 +881,6 @@ bool LLAppViewer::init() gGLManager.getGLInfo(gDebugInfo); gGLManager.printGLInfoString(); - //load key settings - bind_keyboard_functions(); - // Load Default bindings load_default_bindings(gSavedSettings.getBOOL("LiruUseZQSDKeys")); diff --git a/indra/newview/llenvmanager.cpp b/indra/newview/llenvmanager.cpp index 3033d4e07..8f31c6c6f 100644 --- a/indra/newview/llenvmanager.cpp +++ b/indra/newview/llenvmanager.cpp @@ -105,9 +105,11 @@ void LLEnvPrefs::setUseDayCycle(const std::string& name) } //============================================================================= -LLEnvManagerNew::LLEnvManagerNew() +LLEnvManagerNew::LLEnvManagerNew(): + mInterpNextChangeMessage(true), + mCurRegionUUID(LLUUID::null), + mLastReceivedID(LLUUID::null) { - mInterpNextChangeMessage = true; // Set default environment settings. mUserPrefs.mUseRegionSettings = true; @@ -115,6 +117,9 @@ LLEnvManagerNew::LLEnvManagerNew() mUserPrefs.mWaterPresetName = "Default"; mUserPrefs.mSkyPresetName = "Default"; mUserPrefs.mDayCycleName = "Default"; + + LL_DEBUGS("Windlight")<getRegionID() : LLUUID::null; - if (region_uuid == mCurRegionUUID) + if (region_uuid != mCurRegionUUID) { - return; + // Clear locally modified region settings. + mNewRegionPrefs.clear(); + + // *TODO: clear environment settings of the previous region? + + // Request environment settings of the new region. + mCurRegionUUID = region_uuid; + // for region crossings, interpolate the change; for teleports, don't + mInterpNextChangeMessage = (gAgent.getTeleportState() == LLAgent::TELEPORT_NONE); + LL_DEBUGS("Windlight") << (mInterpNextChangeMessage ? "Crossed" : "Teleported") + << " to new region: " << region_uuid + << LL_ENDL; + requestRegionSettings(); + } + else + { + LL_DEBUGS("Windlight") << "disregarding region change; interp: " + << (mInterpNextChangeMessage ? "true" : "false") + << " regionp: " << regionp + << " old: " << mCurRegionUUID + << " new: " << region_uuid + << LL_ENDL; } - - // Clear locally modified region settings. - mNewRegionPrefs.clear(); - - // *TODO: clear environment settings of the previous region? - - // Request environment settings of the new region. - LL_DEBUGS("Windlight") << "New viewer region: " << region_uuid << LL_ENDL; - mCurRegionUUID = region_uuid; - mInterpNextChangeMessage = interpolate; - requestRegionSettings(); - - // Let interested parties know agent region has been changed. - mRegionChangeSignal(); } // Aurora-sim windlight refresh @@ -729,7 +731,7 @@ class WindLightRefresh : public LLHTTPNode llinfos << "Windlight Refresh, interpolate:" << env->mInterpNextChangeMessage << llendl; env->requestRegionSettings(); - env->mRegionChangeSignal(); + env->onRegionChange(); } }; diff --git a/indra/newview/llenvmanager.h b/indra/newview/llenvmanager.h index 8d5317996..6d7efeab6 100644 --- a/indra/newview/llenvmanager.h +++ b/indra/newview/llenvmanager.h @@ -2,31 +2,25 @@ * @file llenvmanager.h * @brief Declaration of classes managing WindLight and water settings. * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - * - * Copyright (c) 2009, Linden Research, Inc. - * + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * Copyright (C) 2011, Linden Research, Inc. * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * 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. * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * 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. * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * 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$ */ @@ -39,7 +33,6 @@ class LLWLParamManager; class LLWaterParamManager; class LLWLAnimator; -class WindLightRefresh; // generic key struct LLEnvKey @@ -173,7 +166,6 @@ class LLEnvManagerNew : public LLSingleton public: typedef boost::signals2::signal prefs_change_signal_t; typedef boost::signals2::signal region_settings_change_signal_t; - typedef boost::signals2::signal region_change_signal_t; typedef boost::signals2::signal region_settings_applied_signal_t; LLEnvManagerNew(); @@ -229,15 +221,12 @@ public: bool sendRegionSettings(const LLEnvironmentSettings& new_settings); boost::signals2::connection setPreferencesChangeCallback(const prefs_change_signal_t::slot_type& cb); boost::signals2::connection setRegionSettingsChangeCallback(const region_settings_change_signal_t::slot_type& cb); - boost::signals2::connection setRegionChangeCallback(const region_change_signal_t::slot_type& cb); boost::signals2::connection setRegionSettingsAppliedCallback(const region_settings_applied_signal_t::slot_type& cb); static bool canEditRegionSettings(); /// @return true if we have access to editing region environment static const std::string getScopeString(LLEnvKey::EScope scope); // Public callbacks. - void onRegionCrossing(); - void onTeleport(); void onRegionSettingsResponse(const LLSD& content); void onRegionSettingsApplyResponse(bool ok); @@ -261,7 +250,7 @@ private: bool useDefaultSky(); bool useDefaultWater(); - void onRegionChange(bool interpolate); + void onRegionChange(); /// Emitted when user environment preferences change. prefs_change_signal_t mUsePrefsChangeSignal; @@ -269,9 +258,6 @@ private: /// Emitted when region environment settings update comes. region_settings_change_signal_t mRegionSettingsChangeSignal; - /// Emitted when agent region changes. Move to LLAgent? - region_change_signal_t mRegionChangeSignal; - /// Emitted when agent region changes. Move to LLAgent? region_settings_applied_signal_t mRegionSettingsAppliedSignal; diff --git a/indra/newview/llestateinfomodel.cpp b/indra/newview/llestateinfomodel.cpp index 09c05f3af..b15a1cced 100644 --- a/indra/newview/llestateinfomodel.cpp +++ b/indra/newview/llestateinfomodel.cpp @@ -38,9 +38,6 @@ #include "llfloaterregioninfo.h" // for invoice id #include "llviewerregion.h" -class AIHTTPTimeoutPolicy; -extern AIHTTPTimeoutPolicy estateChangeInfoResponder_timeout; - LLEstateInfoModel::LLEstateInfoModel() : mID(0) , mFlags(0) @@ -68,12 +65,12 @@ void LLEstateInfoModel::sendEstateInfo() } } -bool LLEstateInfoModel::getUseFixedSun() const { return mFlags & REGION_FLAGS_SUN_FIXED; } -bool LLEstateInfoModel::getIsExternallyVisible() const { return mFlags & REGION_FLAGS_EXTERNALLY_VISIBLE; } -bool LLEstateInfoModel::getAllowDirectTeleport() const { return mFlags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT; } -bool LLEstateInfoModel::getDenyAnonymous() const { return mFlags & REGION_FLAGS_DENY_ANONYMOUS; } -bool LLEstateInfoModel::getDenyAgeUnverified() const { return mFlags & REGION_FLAGS_DENY_AGEUNVERIFIED; } -bool LLEstateInfoModel::getAllowVoiceChat() const { return mFlags & REGION_FLAGS_ALLOW_VOICE; } +bool LLEstateInfoModel::getUseFixedSun() const { return getFlag(REGION_FLAGS_SUN_FIXED); } +bool LLEstateInfoModel::getIsExternallyVisible() const { return getFlag(REGION_FLAGS_EXTERNALLY_VISIBLE); } +bool LLEstateInfoModel::getAllowDirectTeleport() const { return getFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT); } +bool LLEstateInfoModel::getDenyAnonymous() const { return getFlag(REGION_FLAGS_DENY_ANONYMOUS); } +bool LLEstateInfoModel::getDenyAgeUnverified() const { return getFlag(REGION_FLAGS_DENY_AGEUNVERIFIED); } +bool LLEstateInfoModel::getAllowVoiceChat() const { return getFlag(REGION_FLAGS_ALLOW_VOICE); } void LLEstateInfoModel::setUseFixedSun(bool val) { setFlag(REGION_FLAGS_SUN_FIXED, val); } void LLEstateInfoModel::setIsExternallyVisible(bool val) { setFlag(REGION_FLAGS_EXTERNALLY_VISIBLE, val); } @@ -118,19 +115,18 @@ class LLEstateChangeInfoResponder : public LLHTTPClient::ResponderWithResult public: // if we get a normal response, handle it here - /*virtual*/ void httpSuccess(void) + virtual void httpSuccess() { llinfos << "Committed estate info" << llendl; LLEstateInfoModel::instance().notifyCommit(); } // if we get an error response - /*virtual*/ void httpFailure(void) + virtual void httpFailure() { - llwarns << "Failed to commit estate info (" << mStatus << "): " << mReason << llendl; + llwarns << "Failed to commit estate info [status:" << mStatus << "]: " << mReason << llendl; } - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return estateChangeInfoResponder_timeout; } /*virtual*/ char const* getName(void) const { return "LLEstateChangeInfoResponder"; } }; @@ -205,18 +201,6 @@ void LLEstateInfoModel::commitEstateInfoDataserver() gAgent.sendMessage(); } -void LLEstateInfoModel::setFlag(U32 flag, bool val) -{ - if (val) - { - mFlags |= flag; - } - else - { - mFlags &= ~flag; - } -} - std::string LLEstateInfoModel::getInfoDump() { LLSD dump; diff --git a/indra/newview/llestateinfomodel.h b/indra/newview/llestateinfomodel.h index 30e83b140..b83d17f8d 100644 --- a/indra/newview/llestateinfomodel.h +++ b/indra/newview/llestateinfomodel.h @@ -86,19 +86,38 @@ protected: private: bool commitEstateInfoCaps(); void commitEstateInfoDataserver(); - U32 getFlags() const { return mFlags; } - void setFlag(U32 flag, bool val); + inline bool getFlag(U64 flag) const; + inline void setFlag(U64 flag, bool val); + U64 getFlags() const { return mFlags; } std::string getInfoDump(); // estate info std::string mName; /// estate name LLUUID mOwnerID; /// estate owner id U32 mID; /// estate id - U32 mFlags; /// estate flags + U64 mFlags; /// estate flags F32 mSunHour; /// estate sun hour update_signal_t mUpdateSignal; /// emitted when we receive update from sim update_signal_t mCommitSignal; /// emitted when our update gets applied to sim }; +inline bool LLEstateInfoModel::getFlag(U64 flag) const +{ + return ((mFlags & flag) != 0); +} + +inline void LLEstateInfoModel::setFlag(U64 flag, bool val) +{ + if (val) + { + mFlags |= flag; + } + else + { + mFlags &= ~flag; + } +} + + #endif // LL_LLESTATEINFOMODEL_H diff --git a/indra/newview/llfloaterdirectory.cpp b/indra/newview/llfloaterdirectory.cpp index ce2f71e16..ed01ff283 100644 --- a/indra/newview/llfloaterdirectory.cpp +++ b/indra/newview/llfloaterdirectory.cpp @@ -54,7 +54,6 @@ #include "hippogridmanager.h" #include "lfsimfeaturehandler.h" -#include "llenvmanager.h" #include "llnotificationsutil.h" #include "llviewerregion.h" @@ -279,7 +278,7 @@ LLFloaterDirectory::LLFloaterDirectory(const std::string& name) LLPanelDirMarket* marketp = static_cast(container->getPanelByName(market_panel)); container->removeTabPanel(marketp); // Until we get a MarketPlace URL, tab is removed. marketp->handleRegionChange(container); - LLEnvManagerNew::instance().setRegionChangeCallback(boost::bind(&LLPanelDirMarket::handleRegionChange, marketp, container)); + gAgent.addRegionChangedCallback(boost::bind(&LLPanelDirMarket::handleRegionChange, marketp, container)); } container->setCommitCallback(boost::bind(&LLFloaterDirectory::onTabChanged,_2)); } diff --git a/indra/newview/llfloatergroups.cpp b/indra/newview/llfloatergroups.cpp index 8cb6681ba..8be4611bf 100644 --- a/indra/newview/llfloatergroups.cpp +++ b/indra/newview/llfloatergroups.cpp @@ -185,7 +185,7 @@ LLPanelGroups::~LLPanelGroups() // clear the group list, and get a fresh set of info. void LLPanelGroups::reset() { - getChild("groupcount")->setTextArg("[COUNT]", llformat("%d",gAgent.mGroups.count())); + getChild("groupcount")->setTextArg("[COUNT]", llformat("%d",gAgent.mGroups.size())); getChild("groupcount")->setTextArg("[MAX]", llformat("%d", gHippoLimits->getMaxAgentGroups())); init_group_list(getChild("group list"), gAgent.getGroupID()); @@ -194,7 +194,7 @@ void LLPanelGroups::reset() BOOL LLPanelGroups::postBuild() { - getChild("groupcount")->setTextArg("[COUNT]", llformat("%d",gAgent.mGroups.count())); + getChild("groupcount")->setTextArg("[COUNT]", llformat("%d",gAgent.mGroups.size())); getChild("groupcount")->setTextArg("[MAX]", llformat("%d",gHippoLimits->getMaxAgentGroups())); LLScrollListCtrl *list = getChild("group list"); @@ -231,7 +231,7 @@ BOOL LLPanelGroups::postBuild() void LLPanelGroups::enableButtons() { - getChildView("Create")->setEnabled(gAgent.mGroups.count() < gHippoLimits->getMaxAgentGroups()); + getChildView("Create")->setEnabled(gAgent.canJoinGroups()); LLScrollListCtrl* group_list = getChild("group list"); if (!group_list) return; LLUUID group_id; @@ -368,7 +368,7 @@ LLSD create_group_element(const LLGroupData *group_datap, const LLUUID &active_g void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, U64 powers_mask) { - S32 count = gAgent.mGroups.count(); + S32 count = gAgent.mGroups.size(); LLUUID id; LLCtrlListInterface *group_list = ctrl->getListInterface(); if (!group_list) return; @@ -381,7 +381,7 @@ void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, U64 pow for(S32 i = 0; i < count; ++i) { - LLSD element = create_group_element(&gAgent.mGroups.get(i), highlight_id, powers_mask); + LLSD element = create_group_element(&gAgent.mGroups[i], highlight_id, powers_mask); if(element.size()) group_list->addElement(element, ADD_SORTED); } diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 874e45c49..488f32186 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -165,19 +165,39 @@ LLParcel* LLFloaterLand::getCurrentSelectedParcel() //static LLPanelLandObjects* LLFloaterLand::getCurrentPanelLandObjects() { - return LLFloaterLand::getInstance()->mPanelObjects; + LLFloaterLand* land_instance = LLFloaterLand::getInstance(); + if (land_instance) + { + return land_instance->mPanelObjects; + } + else + { + return NULL; + } } //static LLPanelLandCovenant* LLFloaterLand::getCurrentPanelLandCovenant() { - return LLFloaterLand::getInstance()->mPanelCovenant; + LLFloaterLand* land_instance = LLFloaterLand::getInstance(); + if (land_instance) + { + return land_instance->mPanelCovenant; + } + else + { + return NULL; + } } // static void LLFloaterLand::refreshAll() { - LLFloaterLand::getInstance()->refresh(); + LLFloaterLand* land_instance = LLFloaterLand::getInstance(); + if (land_instance) + { + land_instance->refresh(); + } } void LLFloaterLand::onOpen() @@ -763,6 +783,7 @@ void LLPanelLandGeneral::refresh() BOOL use_pass = parcel->getOwnerID()!= gAgent.getID() && parcel->getParcelFlag(PF_USE_PASS_LIST) && !LLViewerParcelMgr::getInstance()->isCollisionBanned();; mBtnBuyPass->setEnabled(use_pass); + } } @@ -857,11 +878,13 @@ void LLPanelLandGeneral::onClickProfile() if (parcel->getIsGroupOwned()) { - LLGroupActions::show(parcel->getGroupID()); + const LLUUID& group_id = parcel->getGroupID(); + LLGroupActions::show(group_id); } else { - LLAvatarActions::showProfile(parcel->getOwnerID()); + const LLUUID& avatar_id = parcel->getOwnerID(); + LLAvatarActions::showProfile(avatar_id); } } @@ -1538,7 +1561,7 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo BOOL is_group_owned; S32 object_count; U32 most_recent_time = 0; - BOOL is_online = 0; + BOOL is_online; std::string object_count_str; //BOOL b_need_refresh = FALSE; @@ -1553,7 +1576,7 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo std::vector avatar_ids; std::vector positions; LLWorld::instance().getAvatars(&avatar_ids, &positions, mypos, F32_MAX); - + for(S32 i = 0; i < rows; ++i) { msg->getUUIDFast(_PREHASH_Data, _PREHASH_OwnerID, owner_id, i); @@ -2834,11 +2857,12 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata) void LLPanelLandAccess::onClickAddAccess() { + LLFloater* root_floater = gFloaterView->getParentFloater(this); LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show( boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1)); if (picker) { - gFloaterView->getParentFloater(this)->addDependentFloater(picker); + root_floater->addDependentFloater(picker); } } @@ -2882,11 +2906,12 @@ void LLPanelLandAccess::onClickRemoveAccess(void* data) void LLPanelLandAccess::onClickAddBanned() { + LLFloater* root_floater = gFloaterView->getParentFloater(this); LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show( boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1)); if (picker) { - gFloaterView->getParentFloater(this)->addDependentFloater(picker); + root_floater->addDependentFloater(picker); } } @@ -3064,15 +3089,15 @@ void LLFloaterLand::open() // Ideally we could just use LLViewerParcelMgr::isParcelOwnedByAgent(), but that has that sneaky exemption // for fake god like (aka View Admin Options) const LLUUID& idOwner = pParcel->getOwnerID(); - if ( (idOwner != gAgent.getID()) ) + if (idOwner != gAgentID) { // *sighs* LLAgent::hasPowerInGroup() has it too so copy/paste from there - S32 count = gAgent.mGroups.count(); bool fShow = false; + S32 count = gAgent.mGroups.size(); bool fShow = false; for (S32 i = 0; i < count; ++i) { - if (gAgent.mGroups.get(i).mID == idOwner) + if (gAgent.mGroups[i].mID == idOwner) { - fShow |= ((gAgent.mGroups.get(i).mPowers & GP_LAND_RETURN) > 0); + fShow |= ((gAgent.mGroups[i].mPowers & GP_LAND_RETURN) > 0); break; } } diff --git a/indra/newview/llfloaterlandholdings.cpp b/indra/newview/llfloaterlandholdings.cpp index 4949678c1..9046e768f 100644 --- a/indra/newview/llfloaterlandholdings.cpp +++ b/indra/newview/llfloaterlandholdings.cpp @@ -100,27 +100,26 @@ BOOL LLFloaterLandHoldings::postBuild() childSetAction("Teleport", onClickTeleport, this); childSetAction("Show on Map", onClickMap, this); - LLScrollListCtrl *grant_list = getChild("grant list"); - // Grant list + LLScrollListCtrl *grant_list = getChild("grant list"); grant_list->setDoubleClickCallback(boost::bind(LLGroupActions::show, boost::bind(&LLScrollListCtrl::getCurrentID, grant_list))); LLCtrlListInterface *list = grant_list->getListInterface(); if (!list) return TRUE; - S32 count = gAgent.mGroups.count(); + S32 count = gAgent.mGroups.size(); for(S32 i = 0; i < count; ++i) { - LLUUID id(gAgent.mGroups.get(i).mID); + LLUUID id(gAgent.mGroups.at(i).mID); LLSD element; element["id"] = id; element["columns"][0]["column"] = "group"; - element["columns"][0]["value"] = gAgent.mGroups.get(i).mName; + element["columns"][0]["value"] = gAgent.mGroups.at(i).mName; element["columns"][0]["font"] = "SANSSERIF"; LLUIString areastr = getString("area_string"); - areastr.setArg("[AREA]", llformat("%d", gAgent.mGroups.get(i).mContribution)); + areastr.setArg("[AREA]", llformat("%d", gAgent.mGroups.at(i).mContribution)); element["columns"][1]["column"] = "area"; element["columns"][1]["value"] = areastr; element["columns"][1]["font"] = "SANSSERIF"; @@ -128,6 +127,8 @@ BOOL LLFloaterLandHoldings::postBuild() list->addElement(element, ADD_SORTED); } + center(); + return TRUE; } @@ -157,8 +158,8 @@ void LLFloaterLandHoldings::refresh() enable_btns = TRUE; } - childSetEnabled("Teleport", enable_btns); - childSetEnabled("Show on Map", enable_btns); + getChildView("Teleport")->setEnabled(enable_btns); + getChildView("Show on Map")->setEnabled(enable_btns); refreshAggregates(); } @@ -291,15 +292,16 @@ void LLFloaterLandHoldings::buttonCore(S32 which) F64 global_z = gAgent.getPositionGlobal().mdV[VZ]; LLVector3d pos_global(global_x, global_y, global_z); + LLFloaterWorldMap* floater_world_map = gFloaterWorldMap; switch(which) { case 0: gAgent.teleportViaLocation(pos_global); - gFloaterWorldMap->trackLocation(pos_global); + if(floater_world_map) floater_world_map->trackLocation(pos_global); break; case 1: - gFloaterWorldMap->trackLocation(pos_global); + if(floater_world_map) floater_world_map->trackLocation(pos_global); LLFloaterWorldMap::show(true); break; default: @@ -329,7 +331,7 @@ void LLFloaterLandHoldings::refreshAggregates() S32 current_area = gStatusBar->getSquareMetersCommitted(); S32 available_area = gStatusBar->getSquareMetersLeft(); - childSetTextArg("allowed_text", "[AREA]", llformat("%d",allowed_area)); - childSetTextArg("current_text", "[AREA]", llformat("%d",current_area)); - childSetTextArg("available_text", "[AREA]", llformat("%d",available_area)); + getChild("allowed_text")->setTextArg("[AREA]", llformat("%d",allowed_area)); + getChild("current_text")->setTextArg("[AREA]", llformat("%d",current_area)); + getChild("available_text")->setTextArg("[AREA]", llformat("%d",available_area)); } diff --git a/indra/newview/llfloaterpathfindingobjects.cpp b/indra/newview/llfloaterpathfindingobjects.cpp index 7fe3311cb..f8c170063 100644 --- a/indra/newview/llfloaterpathfindingobjects.cpp +++ b/indra/newview/llfloaterpathfindingobjects.cpp @@ -41,7 +41,6 @@ #include "llavatarnamecache.h" #include "llbutton.h" #include "llcheckboxctrl.h" -#include "llenvmanager.h" #include "llfloater.h" #include "llfontgl.h" #include "llnotifications.h" @@ -84,7 +83,7 @@ void LLFloaterPathfindingObjects::onOpen(/*const LLSD &pKey*/) if (!mRegionBoundaryCrossingSlot.connected()) { - mRegionBoundaryCrossingSlot = LLEnvManagerNew::getInstance()->setRegionChangeCallback(boost::bind(&LLFloaterPathfindingObjects::onRegionBoundaryCrossed, this)); + mRegionBoundaryCrossingSlot = gAgent.addRegionChangedCallback(boost::bind(&LLFloaterPathfindingObjects::onRegionBoundaryCrossed, this)); } if (!mGodLevelChangeSlot.connected()) @@ -384,19 +383,31 @@ void LLFloaterPathfindingObjects::buildObjectsScrollList(const LLPathfindingObje void LLFloaterPathfindingObjects::addObjectToScrollList(const LLPathfindingObjectPtr pObjectPtr, const LLSD &pScrollListItemData) { - LLSD rowParams; - rowParams["id"] = pObjectPtr->getUUID(); + LLScrollListCell::Params cellParams; + //cellParams.font = LLFontGL::getFontSansSerif(); + + LLScrollListItem::Params rowParams; + rowParams.value = pObjectPtr->getUUID().asString(); llassert(pScrollListItemData.isArray()); - S32 idx = 0; for (LLSD::array_const_iterator cellIter = pScrollListItemData.beginArray(); cellIter != pScrollListItemData.endArray(); ++cellIter) { - rowParams["columns"][idx] = *cellIter; - idx++; + const LLSD &cellElement = *cellIter; + + llassert(cellElement.has("column")); + llassert(cellElement.get("column").isString()); + cellParams.column = cellElement.get("column").asString(); + + llassert(cellElement.has("value")); + llassert(cellElement.get("value").isString()); + cellParams.value = cellElement.get("value").asString(); + + rowParams.columns.add(cellParams); } - LLScrollListItem *scrollListItem = mObjectsScrollList->addElement(rowParams); + LLScrollListItem *scrollListItem = mObjectsScrollList->addRow(rowParams); + if (pObjectPtr->hasOwner() && !pObjectPtr->hasOwnerName()) { mMissingNameObjectsScrollListItems.insert(std::make_pair(pObjectPtr->getUUID().asString(), scrollListItem)); diff --git a/indra/newview/llfloaterregiondebugconsole.cpp b/indra/newview/llfloaterregiondebugconsole.cpp index 39404fa20..31699d9ea 100644 --- a/indra/newview/llfloaterregiondebugconsole.cpp +++ b/indra/newview/llfloaterregiondebugconsole.cpp @@ -37,10 +37,6 @@ #include "llviewerregion.h" #include "lluictrlfactory.h" -class AIHTTPTimeoutPolicy; -extern AIHTTPTimeoutPolicy asyncConsoleResponder_timeout; -extern AIHTTPTimeoutPolicy consoleResponder_timeout; - // Two versions of the sim console API are supported. // // SimConsole capability (deprecated): @@ -81,7 +77,6 @@ namespace { public: /*virtual*/ void httpFailure(void) { sConsoleReplySignal(UNABLE_TO_SEND_COMMAND); } - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return asyncConsoleResponder_timeout; } /*virtual*/ char const* getName(void) const { return "AsyncConsoleResponder"; } }; @@ -111,7 +106,6 @@ namespace } } - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return consoleResponder_timeout; } /*virtual*/ char const* getName(void) const { return "ConsoleResponder"; } LLTextEditor * mOutput; diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 7df8e5272..23db2f4e8 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -61,6 +61,7 @@ #include "llfloatergodtools.h" // for send_sim_wide_deletes() #include "llfloatertopobjects.h" // added to fix SL-32336 #include "llfloatergroups.h" +#include "llfloaterregiondebugconsole.h" #include "llfloatertelehub.h" #include "llinventorymodel.h" #include "lllineeditor.h" @@ -94,9 +95,6 @@ const S32 TERRAIN_TEXTURE_COUNT = 4; const S32 CORNER_COUNT = 4; -class AIHTTPTimeoutPolicy; -extern AIHTTPTimeoutPolicy estateChangeInfoResponder_timeout; - ///---------------------------------------------------------------------------- /// Local class declaration ///---------------------------------------------------------------------------- @@ -252,7 +250,7 @@ BOOL LLFloaterRegionInfo::postBuild() &processEstateOwnerRequest); // Request region info when agent region changes. - LLEnvManagerNew::instance().setRegionChangeCallback(boost::bind(&LLFloaterRegionInfo::requestRegionInfo, this)); + gAgent.addRegionChangedCallback(boost::bind(&LLFloaterRegionInfo::requestRegionInfo, this)); return TRUE; } @@ -269,6 +267,7 @@ void LLFloaterRegionInfo::onOpen() refreshFromRegion(gAgent.getRegion()); requestRegionInfo(); + requestMeshRezInfo(); LLFloater::onOpen(); } @@ -650,9 +649,10 @@ void LLPanelRegionInfo::initCtrl(const std::string& name) getChild(name)->setCommitCallback(boost::bind(&LLPanelRegionInfo::onChangeAnything, this)); } +// Singu TODO: Make this a callback registrar function instead. void LLPanelRegionInfo::initHelpBtn(const std::string& name, const std::string& xml_alert) { - childSetAction(name, boost::bind(&LLPanelRegionInfo::onClickHelp, this, xml_alert)); + getChild(name)->setCommitCallback(boost::bind(&LLPanelRegionInfo::onClickHelp, this, xml_alert)); } void LLPanelRegionInfo::onClickHelp(const std::string& xml_alert) @@ -857,6 +857,46 @@ bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const L return false; } +class ConsoleRequestResponder : public LLHTTPClient::ResponderIgnoreBody +{ + LOG_CLASS(ConsoleRequestResponder); +protected: + /*virtual*/ + void httpFailure() + { + llwarns << "error requesting mesh_rez_enabled " << dumpResponse() << llendl; + } + /*virtual*/ const char* getName() const { return "ConsoleRequestResponder"; } +}; + + +// called if this request times out. +class ConsoleUpdateResponder : public LLHTTPClient::ResponderIgnoreBody +{ + LOG_CLASS(ConsoleUpdateResponder); +protected: + /* virtual */ + void httpFailure() + { + llwarns << "error updating mesh enabled region setting " << dumpResponse() << llendl; + } +}; + +void LLFloaterRegionInfo::requestMeshRezInfo() +{ + std::string sim_console_url = gAgent.getRegion()->getCapability("SimConsoleAsync"); + + if (!sim_console_url.empty()) + { + std::string request_str = "get mesh_rez_enabled"; + + LLHTTPClient::post( + sim_console_url, + LLSD(request_str), + new ConsoleRequestResponder); + } +} + // setregioninfo // strings[0] = 'Y' - block terraform, 'N' - not // strings[1] = 'Y' - block fly, 'N' - not @@ -969,6 +1009,7 @@ BOOL LLPanelRegionDebugInfo::postBuild() childSetAction("top_scripts_btn", onClickTopScripts, this); childSetAction("restart_btn", onClickRestart, this); childSetAction("cancel_restart_btn", onClickCancelRestart, this); + childSetAction("region_debug_console_btn", onClickDebugConsole, this); return TRUE; } @@ -990,6 +1031,7 @@ bool LLPanelRegionDebugInfo::refreshFromRegion(LLViewerRegion* region) getChildView("top_scripts_btn")->setEnabled(allow_modify); getChildView("restart_btn")->setEnabled(allow_modify); getChildView("cancel_restart_btn")->setEnabled(allow_modify); + getChildView("region_debug_console_btn")->setEnabled(allow_modify); return LLPanelRegionInfo::refreshFromRegion(region); } @@ -1145,6 +1187,11 @@ void LLPanelRegionDebugInfo::onClickCancelRestart(void* data) self->sendEstateOwnerMessage(gMessageSystem, "restart", invoice, strings); } +// static +void LLPanelRegionDebugInfo::onClickDebugConsole(void* data) +{ + LLFloaterRegionDebugConsole::getInstance()->open(); +} BOOL LLPanelRegionTerrainInfo::validateTextureSizes() { @@ -1162,7 +1209,7 @@ BOOL LLPanelRegionTerrainInfo::validateTextureSizes() S32 width = img->getFullWidth(); S32 height = img->getFullHeight(); - //llinfos << "texture detail " << i << " is " << width << "x" << height << "x" << components << llendl; + //LL_INFOS() << "texture detail " << i << " is " << width << "x" << height << "x" << components << LL_ENDL; if (components != 3) { @@ -1173,7 +1220,7 @@ BOOL LLPanelRegionTerrainInfo::validateTextureSizes() return FALSE; } - if (width > 1024 || height > 1024) + if (width > 1024 || height > 1024) // { LLSD args; @@ -1590,7 +1637,7 @@ void LLPanelEstateInfo::onClickKickUser() void LLPanelEstateInfo::onKickUserCommit(const uuid_vec_t& ids, const std::vector& names) { if (names.empty() || ids.empty()) return; - + //check to make sure there is one valid user and id if( ids[0].isNull() ) { @@ -1794,7 +1841,7 @@ void LLPanelEstateInfo::accessAddCore3(const uuid_vec_t& ids, LLEstateAccessChan LLSD args; args["NUM_ADDED"] = llformat("%d",ids.size()); args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); - args["LIST_TYPE"] = "Allowed Residents"; + args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeAllowedAgents"); args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS); LLNotificationsUtil::add("MaxAgentOnRegionBatch", args); delete change_info; @@ -1810,7 +1857,7 @@ void LLPanelEstateInfo::accessAddCore3(const uuid_vec_t& ids, LLEstateAccessChan LLSD args; args["NUM_ADDED"] = llformat("%d",ids.size()); args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); - args["LIST_TYPE"] = "Banned Residents"; + args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeBannedAgents"); args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS); LLNotificationsUtil::add("MaxAgentOnRegionBatch", args); delete change_info; @@ -2337,16 +2384,18 @@ void LLPanelEstateInfo::getEstateOwner() class LLEstateChangeInfoResponder : public LLHTTPClient::ResponderWithResult { + LOG_CLASS(LLEstateChangeInfoResponder); public: LLEstateChangeInfoResponder(LLPanelEstateInfo* panel) { mpPanel = panel->getHandle(); } +protected: // if we get a normal response, handle it here - /*virtual*/ void httpSuccess(void) + virtual void httpSuccess() { - LL_INFOS("Windlight") << "Successfully committed estate info" << llendl; + LL_INFOS("Windlight") << "Successfully committed estate info" << LL_ENDL; // refresh the panel from the database LLPanelEstateInfo* panel = dynamic_cast(mpPanel.get()); @@ -2355,13 +2404,11 @@ public: } // if we get an error response - /*virtual*/ void httpFailure(void) + virtual void httpFailure() { - llinfos << "LLEstateChangeInfoResponder::error [status:" - << mStatus << "]: " << mReason << llendl; + LL_WARNS("Windlight") << dumpResponse() << LL_ENDL; } - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return estateChangeInfoResponder_timeout; } /*virtual*/ char const* getName(void) const { return "LLEstateChangeInfoResponder"; } private: @@ -2931,9 +2978,10 @@ bool LLDispatchSetEstateAccess::operator()( } - std::string msg = llformat("Banned residents: (%d, max %d)", - totalBannedAgents, - ESTATE_MAX_ACCESS_IDS); + LLStringUtil::format_map_t args; + args["[BANNEDAGENTS]"] = llformat("%d", totalBannedAgents); + args["[MAXBANNED]"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); + std::string msg = LLTrans::getString("RegionInfoBannedResidents", args); panel->getChild("ban_resident_label")->setValue(LLSD(msg)); if (banned_agent_name_list) @@ -2953,9 +3001,10 @@ bool LLDispatchSetEstateAccess::operator()( if (access_flags & ESTATE_ACCESS_MANAGERS) { - std::string msg = llformat("Estate Managers: (%d, max %d)", - num_estate_managers, - ESTATE_MAX_MANAGERS); + LLStringUtil::format_map_t args; + args["[ESTATEMANAGERS]"] = llformat("%d", num_estate_managers); + args["[MAXMANAGERS]"] = llformat("%d", ESTATE_MAX_MANAGERS); + std::string msg = LLTrans::getString("RegionInfoEstateManagers", args); panel->getChild("estate_manager_label")->setValue(LLSD(msg)); LLNameListCtrl* estate_manager_name_list = @@ -3586,12 +3635,9 @@ void LLFloaterRegionInfo::open() // We'll allow access to the estate tools for estate managers (and for the sim owner) if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) { - LLViewerRegion* pRegion = gAgent.getRegion(); - if (!pRegion) - return; - + const LLViewerRegion* region(gAgent.getRegion()); // Should be able to call LLRegion::canManageEstate() but then we can fake god like - if ( (!pRegion->isEstateManager()) && (pRegion->getOwner() != gAgent.getID()) ) + if (!(region && region->isEstateManager() && region->getOwner() == gAgentID)) return; } diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index 00c672b9d..128deaebe 100644 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -95,11 +95,15 @@ public: virtual void refresh(); void requestRegionInfo(); + void requestMeshRezInfo(); + +private: protected: LLFloaterRegionInfo(const LLSD& seed); ~LLFloaterRegionInfo(); +protected: void onTabSelected(const LLSD& param); void refreshFromRegion(LLViewerRegion* region); @@ -211,6 +215,7 @@ protected: static void onClickRestart(void* data); bool callbackRestart(const LLSD& notification, const LLSD& response); static void onClickCancelRestart(void* data); + static void onClickDebugConsole(void* data); private: LLUUID mTargetAvatar; @@ -229,6 +234,7 @@ public: virtual BOOL postBuild(); // LLPanel virtual bool refreshFromRegion(LLViewerRegion* region); // refresh local settings from region update from simulator + void setEnvControls(bool available); // Whether environment settings are available for this region BOOL validateTextureSizes(); diff --git a/indra/newview/llfloaterregionrestarting.cpp b/indra/newview/llfloaterregionrestarting.cpp index a5eeeeecc..98406389b 100644 --- a/indra/newview/llfloaterregionrestarting.cpp +++ b/indra/newview/llfloaterregionrestarting.cpp @@ -31,7 +31,6 @@ #include "lluictrlfactory.h" #include "llagent.h" #include "llagentcamera.h" -#include "llenvmanager.h" #include "llviewercontrol.h" #include "llviewerwindow.h" @@ -103,31 +102,49 @@ LLFloaterRegionRestarting::LLFloaterRegionRestarting(const LLSD& key) : { //buildFromFile("floater_region_restarting.xml"); LLUICtrlFactory::getInstance()->buildFloater(this, "floater_region_restarting.xml"); - - LLStringUtil::format_map_t args; - args["[NAME]"] = key["NAME"].asString(); - getChild("region_name")->setValue(getString("RegionName", args)); - mRestartSeconds = getChild("restart_seconds"); + mName = key["NAME"].asString(); // center(); - refresh(); - - mRegionChangedConnection = LLEnvManagerNew::instance().setRegionChangeCallback(boost::bind(&LLFloaterRegionRestarting::close, this, false)); - if (mSeconds <= 20) emergency_teleport(); // For emergency teleports } LLFloaterRegionRestarting::~LLFloaterRegionRestarting() { + if (sShakeState != SHAKE_DONE && sShakeState != SHAKE_START) // Finish shake if needed + { + gAgentCamera.resetView(TRUE, TRUE); + sShakeState = SHAKE_DONE; + } mRegionChangedConnection.disconnect(); } BOOL LLFloaterRegionRestarting::postBuild() { + mRegionChangedConnection = gAgent.addRegionChangedCallback(boost::bind(&LLFloaterRegionRestarting::regionChange, this)); + if (mSeconds <= 20) emergency_teleport(); // For emergency teleports + + LLStringUtil::format_map_t args; + std::string text; + + args["[NAME]"] = mName; + text = getString("RegionName", args); + LLTextBox* textbox = getChild("region_name"); + textbox->setValue(text); + + mRestartSeconds = getChild("restart_seconds"); + setBackgroundColor(gColors.getColor("NotifyCautionBoxColor")); sShakeState = SHAKE_START; + + refresh(); + return TRUE; } +void LLFloaterRegionRestarting::regionChange() +{ + close(); +} + BOOL LLFloaterRegionRestarting::tick() { refresh(); @@ -150,9 +167,9 @@ void LLFloaterRegionRestarting::draw() { LLFloater::draw(); - static const LLCachedControl alchemyRegionShake(gSavedSettings, "AlchemyRegionRestartShake", true); - if (!alchemyRegionShake || isMinimized()) // If we're minimized, leave the user alone - return; + static const LLCachedControl alchemyRegionShake(gSavedSettings, "AlchemyRegionRestartShake", true); + if (!alchemyRegionShake || isMinimized()) // If we're minimized, leave the user alone + return; const F32 SHAKE_INTERVAL = 0.025f; const F32 SHAKE_TOTAL_DURATION = 1.8f; // the length of the default alert tone for this @@ -213,16 +230,6 @@ void LLFloaterRegionRestarting::draw() } } -void LLFloaterRegionRestarting::onClose(bool app_quitting) -{ - if (sShakeState != SHAKE_DONE && sShakeState != SHAKE_START) // Finish shake if needed - { - gAgentCamera.resetView(TRUE, TRUE); - sShakeState = SHAKE_DONE; - } - LLFloater::onClose(app_quitting); -} - void LLFloaterRegionRestarting::updateTime(const U32& time) { mSeconds = time; diff --git a/indra/newview/llfloaterregionrestarting.h b/indra/newview/llfloaterregionrestarting.h index ee7cb1d30..663fe3809 100644 --- a/indra/newview/llfloaterregionrestarting.h +++ b/indra/newview/llfloaterregionrestarting.h @@ -45,10 +45,11 @@ private: virtual BOOL tick(); virtual void refresh(); virtual void draw(); - virtual void onClose(bool app_quitting); + virtual void regionChange(); class LLTextBox* mRestartSeconds; U32 mSeconds; + std::string mName; U32 mShakeIterations; F32 mShakeMagnitude; LLTimer mShakeTimer; diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index c93dbaa9d..7d6710b5a 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -40,7 +40,6 @@ #include "llpanelgroup.h" #include "llviewermessage.h" #include "groupchatlistener.h" -#include "hippolimits.h" // for getMaxAgentGroups // [RLVa:KB] - Checked: 2011-03-28 (RLVa-1.3.0) #include "llslurl.h" #include "rlvactions.h" @@ -239,7 +238,7 @@ void LLGroupActions::startCall(const LLUUID& group_id) // static void LLGroupActions::join(const LLUUID& group_id) { - if (gAgent.mGroups.count() >= gHippoLimits->getMaxAgentGroups()) //!gAgent.canJoinGroups() + if (!gAgent.canJoinGroups()) { LLNotificationsUtil::add("JoinedTooManyGroups"); return; diff --git a/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp index 0dea26fb7..4b08cae72 100644 --- a/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp +++ b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp @@ -54,6 +54,8 @@ LLMenuOptionPathfindingRebakeNavmesh::LLMenuOptionPathfindingRebakeNavmesh() LLMenuOptionPathfindingRebakeNavmesh::~LLMenuOptionPathfindingRebakeNavmesh() { + if (mIsInitialized) + { if (mRebakeNavMeshMode == kRebakeNavMesh_RequestSent) { LL_WARNS("navmeshRebaking") << "During destruction of the LLMenuOptionPathfindingRebakeNavmesh " @@ -61,9 +63,6 @@ LLMenuOptionPathfindingRebakeNavmesh::~LLMenuOptionPathfindingRebakeNavmesh() << "to be received. This could contribute to a crash on exit." << LL_ENDL; } - llassert(!mIsInitialized); - if (mIsInitialized) - { quit(); } } @@ -80,7 +79,7 @@ void LLMenuOptionPathfindingRebakeNavmesh::initialize() if ( !mRegionCrossingSlot.connected() ) { - mRegionCrossingSlot = LLEnvManagerNew::getInstance()->setRegionChangeCallback(boost::bind(&LLMenuOptionPathfindingRebakeNavmesh::handleRegionBoundaryCrossed, this)); + mRegionCrossingSlot = gAgent.addRegionChangedCallback(boost::bind(&LLMenuOptionPathfindingRebakeNavmesh::handleRegionBoundaryCrossed, this)); } if (!mAgentStateSlot.connected()) @@ -93,8 +92,7 @@ void LLMenuOptionPathfindingRebakeNavmesh::initialize() void LLMenuOptionPathfindingRebakeNavmesh::quit() { - llassert(mIsInitialized); - if (mIsInitialized) + if (mIsInitialized) // Quitting from the login screen leaves this uninitialized { if (mNavMeshSlot.connected()) { @@ -174,51 +172,60 @@ void LLMenuOptionPathfindingRebakeNavmesh::handleAgentState(BOOL pCanRebakeRegio void LLMenuOptionPathfindingRebakeNavmesh::handleRebakeNavMeshResponse(bool pResponseStatus) { llassert(mIsInitialized); - if (getMode() == kRebakeNavMesh_RequestSent) + if (mIsInitialized) { - setMode(pResponseStatus ? kRebakeNavMesh_InProgress : kRebakeNavMesh_Default); - } + if (getMode() == kRebakeNavMesh_RequestSent) + { + setMode(pResponseStatus ? kRebakeNavMesh_InProgress : kRebakeNavMesh_Default); + } - if (!pResponseStatus) - { - LLNotificationsUtil::add("PathfindingCannotRebakeNavmesh"); + if (!pResponseStatus) + { + LLNotificationsUtil::add("PathfindingCannotRebakeNavmesh"); + } } } void LLMenuOptionPathfindingRebakeNavmesh::handleNavMeshStatus(const LLPathfindingNavMeshStatus &pNavMeshStatus) { llassert(mIsInitialized); - ERebakeNavMeshMode rebakeNavMeshMode = kRebakeNavMesh_Default; - if (pNavMeshStatus.isValid()) + if (mIsInitialized) { - switch (pNavMeshStatus.getStatus()) + ERebakeNavMeshMode rebakeNavMeshMode = kRebakeNavMesh_Default; + if (pNavMeshStatus.isValid()) { - case LLPathfindingNavMeshStatus::kPending : - case LLPathfindingNavMeshStatus::kRepending : - rebakeNavMeshMode = kRebakeNavMesh_Available; - break; - case LLPathfindingNavMeshStatus::kBuilding : - rebakeNavMeshMode = kRebakeNavMesh_InProgress; - break; - case LLPathfindingNavMeshStatus::kComplete : - rebakeNavMeshMode = kRebakeNavMesh_NotAvailable; - break; - default : - rebakeNavMeshMode = kRebakeNavMesh_Default; - llassert(0); - break; + switch (pNavMeshStatus.getStatus()) + { + case LLPathfindingNavMeshStatus::kPending : + case LLPathfindingNavMeshStatus::kRepending : + rebakeNavMeshMode = kRebakeNavMesh_Available; + break; + case LLPathfindingNavMeshStatus::kBuilding : + rebakeNavMeshMode = kRebakeNavMesh_InProgress; + break; + case LLPathfindingNavMeshStatus::kComplete : + rebakeNavMeshMode = kRebakeNavMesh_NotAvailable; + break; + default: + rebakeNavMeshMode = kRebakeNavMesh_Default; + llassert(0); + break; + } } - } - setMode(rebakeNavMeshMode); + setMode(rebakeNavMeshMode); + } } void LLMenuOptionPathfindingRebakeNavmesh::handleRegionBoundaryCrossed() { llassert(mIsInitialized); - createNavMeshStatusListenerForCurrentRegion(); - mCanRebakeRegion = FALSE; - LLPathfindingManager::getInstance()->requestGetAgentState(); + if (mIsInitialized) + { + createNavMeshStatusListenerForCurrentRegion(); + mCanRebakeRegion = FALSE; + LLPathfindingManager::getInstance()->requestGetAgentState(); + } } void LLMenuOptionPathfindingRebakeNavmesh::createNavMeshStatusListenerForCurrentRegion() @@ -235,3 +242,4 @@ void LLMenuOptionPathfindingRebakeNavmesh::createNavMeshStatusListenerForCurrent LLPathfindingManager::getInstance()->requestGetNavMeshForRegion(currentRegion, true); } } + diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index 99b541b23..723a9cc94 100644 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -65,7 +65,6 @@ #include "lluistring.h" #include "llviewerobject.h" #include "llviewerobjectlist.h" -#include "llenvmanager.h" namespace { @@ -235,7 +234,7 @@ LLMuteList::LLMuteList() : gGenericDispatcher.addHandler("emptymutelist", &sDispatchEmptyMuteList); checkNewRegion(); - LLEnvManagerNew::instance().setRegionChangeCallback(boost::bind(&LLMuteList::checkNewRegion, this)); + gAgent.addRegionChangedCallback(boost::bind(&LLMuteList::checkNewRegion, this)); } //----------------------------------------------------------------------------- diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 94cd97200..60e6768e9 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -1631,12 +1631,12 @@ void LLPanelAvatar::resetGroupList() group_list->deleteAllItems(); - S32 count = gAgent.mGroups.count(); + S32 count = gAgent.mGroups.size(); LLUUID id; for(S32 i = 0; i < count; ++i) { - LLGroupData group_data = gAgent.mGroups.get(i); + LLGroupData group_data = gAgent.mGroups[i]; id = group_data.mID; std::string group_string; /* Show group title? DUMMY_POWER for Don Grep diff --git a/indra/newview/llpathfindingmanager.cpp b/indra/newview/llpathfindingmanager.cpp index 79147655b..5e1bb5c6a 100644 --- a/indra/newview/llpathfindingmanager.cpp +++ b/indra/newview/llpathfindingmanager.cpp @@ -56,15 +56,6 @@ #include "llviewerregion.h" #include "llweb.h" -class AIHTTPTimeoutPolicy; -extern AIHTTPTimeoutPolicy navMeshStatusResponder_timeout; -extern AIHTTPTimeoutPolicy navMeshResponder_timeout; -extern AIHTTPTimeoutPolicy agentStateResponder_timeout; -extern AIHTTPTimeoutPolicy navMeshRebakeResponder_timeout; -extern AIHTTPTimeoutPolicy objectLinksetsResponder_timeout; -extern AIHTTPTimeoutPolicy terrainLinksetsResponder_timeout; -extern AIHTTPTimeoutPolicy charactersResponder_timeout; - #define CAP_SERVICE_RETRIEVE_NAVMESH "RetrieveNavMeshSrc" #define CAP_SERVICE_NAVMESH_STATUS "NavMeshGenerationStatus" @@ -112,19 +103,18 @@ LLHTTPRegistration gHTTPRegistrationAgentStateChangeNode class NavMeshStatusResponder : public LLHTTPClient::ResponderWithResult { + LOG_CLASS(NavMeshStatusResponder); public: - NavMeshStatusResponder(const std::string &pCapabilityURL, LLViewerRegion *pRegion, bool pIsGetStatusOnly); + NavMeshStatusResponder(LLViewerRegion *pRegion, bool pIsGetStatusOnly); virtual ~NavMeshStatusResponder(); - /*virtual*/ void httpSuccess(void); - /*virtual*/ void httpFailure(void); - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return navMeshStatusResponder_timeout; } /*virtual*/ char const* getName(void) const { return "NavMeshStatusResponder"; } protected: + virtual void httpSuccess(); + virtual void httpFailure(); private: - std::string mCapabilityURL; LLViewerRegion *mRegion; LLUUID mRegionUUID; bool mIsGetStatusOnly; @@ -136,19 +126,18 @@ private: class NavMeshResponder : public LLHTTPClient::ResponderWithResult { + LOG_CLASS(NavMeshResponder); public: - NavMeshResponder(const std::string &pCapabilityURL, U32 pNavMeshVersion, LLPathfindingNavMeshPtr pNavMeshPtr); + NavMeshResponder(U32 pNavMeshVersion, LLPathfindingNavMeshPtr pNavMeshPtr); virtual ~NavMeshResponder(); - /*virtual*/ void httpSuccess(void); - /*virtual*/ void httpFailure(void); - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return navMeshResponder_timeout; } /*virtual*/ char const* getName(void) const { return "NavMeshResponder"; } protected: + virtual void httpSuccess(); + virtual void httpFailure(); private: - std::string mCapabilityURL; U32 mNavMeshVersion; LLPathfindingNavMeshPtr mNavMeshPtr; }; @@ -159,19 +148,16 @@ private: class AgentStateResponder : public LLHTTPClient::ResponderWithResult { + LOG_CLASS(AgentStateResponder); public: - AgentStateResponder(const std::string &pCapabilityURL); + AgentStateResponder(); virtual ~AgentStateResponder(); - /*virtual*/ void httpSuccess(void); - /*virtual*/ void httpFailure(void); - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return agentStateResponder_timeout; } /*virtual*/ char const* getName(void) const { return "AgentStateResponder"; } protected: - -private: - std::string mCapabilityURL; + virtual void httpSuccess(); + virtual void httpFailure(); }; @@ -180,19 +166,18 @@ private: //--------------------------------------------------------------------------- class NavMeshRebakeResponder : public LLHTTPClient::ResponderWithResult { + LOG_CLASS(NavMeshRebakeResponder); public: - NavMeshRebakeResponder(const std::string &pCapabilityURL, LLPathfindingManager::rebake_navmesh_callback_t pRebakeNavMeshCallback); + NavMeshRebakeResponder(LLPathfindingManager::rebake_navmesh_callback_t pRebakeNavMeshCallback); virtual ~NavMeshRebakeResponder(); - /*virtual*/ void httpSuccess(void); - /*virtual*/ void httpFailure(void); - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return navMeshRebakeResponder_timeout; } /*virtual*/ char const* getName(void) const { return "NavMeshRebakeResponder"; } protected: + virtual void httpSuccess(); + virtual void httpFailure(); private: - std::string mCapabilityURL; LLPathfindingManager::rebake_navmesh_callback_t mRebakeNavMeshCallback; }; @@ -207,9 +192,9 @@ public: virtual ~LinksetsResponder(); void handleObjectLinksetsResult(const LLSD &pContent); - void handleObjectLinksetsError(U32 pStatus, const std::string &pReason, const std::string &pURL); + void handleObjectLinksetsError(); void handleTerrainLinksetsResult(const LLSD &pContent); - void handleTerrainLinksetsError(U32 pStatus, const std::string &pReason, const std::string &pURL); + void handleTerrainLinksetsError(); protected: @@ -241,19 +226,18 @@ typedef boost::shared_ptr LinksetsResponderPtr; //--------------------------------------------------------------------------- class ObjectLinksetsResponder : public LLHTTPClient::ResponderWithResult { + LOG_CLASS(ObjectLinksetsResponder); public: - ObjectLinksetsResponder(const std::string &pCapabilityURL, LinksetsResponderPtr pLinksetsResponsderPtr); + ObjectLinksetsResponder(LinksetsResponderPtr pLinksetsResponsderPtr); virtual ~ObjectLinksetsResponder(); - /*virtual*/ void httpSuccess(void); - /*virtual*/ void httpFailure(void); - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return objectLinksetsResponder_timeout; } /*virtual*/ char const* getName(void) const { return "ObjectLinksetsResponder"; } protected: + virtual void httpSuccess(); + virtual void httpFailure(); private: - std::string mCapabilityURL; LinksetsResponderPtr mLinksetsResponsderPtr; }; @@ -262,19 +246,18 @@ private: //--------------------------------------------------------------------------- class TerrainLinksetsResponder : public LLHTTPClient::ResponderWithResult { + LOG_CLASS(TerrainLinksetsResponder); public: - TerrainLinksetsResponder(const std::string &pCapabilityURL, LinksetsResponderPtr pLinksetsResponsderPtr); + TerrainLinksetsResponder(LinksetsResponderPtr pLinksetsResponsderPtr); virtual ~TerrainLinksetsResponder(); - /*virtual*/ void httpSuccess(void); - /*virtual*/ void httpFailure(void); - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return terrainLinksetsResponder_timeout; } /*virtual*/ char const* getName(void) const { return "TerrainLinksetsResponder"; } protected: + virtual void httpSuccess(); + virtual void httpFailure(); private: - std::string mCapabilityURL; LinksetsResponderPtr mLinksetsResponsderPtr; }; @@ -283,19 +266,18 @@ private: //--------------------------------------------------------------------------- class CharactersResponder : public LLHTTPClient::ResponderWithResult { + LOG_CLASS(TerrainLinksetsResponder); public: - CharactersResponder(const std::string &pCapabilityURL, LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::object_request_callback_t pCharactersCallback); + CharactersResponder(LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::object_request_callback_t pCharactersCallback); virtual ~CharactersResponder(); - /*virtual*/ void httpSuccess(void); - /*virtual*/ void httpFailure(void); - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return charactersResponder_timeout; } /*virtual*/ char const* getName(void) const { return "CharactersResponder"; } protected: + virtual void httpSuccess(); + virtual void httpFailure(); private: - std::string mCapabilityURL; LLPathfindingManager::request_id_t mRequestId; LLPathfindingManager::object_request_callback_t mCharactersCallback; }; @@ -382,7 +364,7 @@ void LLPathfindingManager::requestGetNavMeshForRegion(LLViewerRegion *pRegion, b std::string navMeshStatusURL = getNavMeshStatusURLForRegion(pRegion); llassert(!navMeshStatusURL.empty()); navMeshPtr->handleNavMeshCheckVersion(); - LLHTTPClient::ResponderPtr navMeshStatusResponder = new NavMeshStatusResponder(navMeshStatusURL, pRegion, pIsGetStatusOnly); + LLHTTPClient::ResponderPtr navMeshStatusResponder = new NavMeshStatusResponder(pRegion, pIsGetStatusOnly); LLHTTPClient::get(navMeshStatusURL, navMeshStatusResponder); } } @@ -416,12 +398,12 @@ void LLPathfindingManager::requestGetLinksets(request_id_t pRequestId, object_re bool doRequestTerrain = isAllowViewTerrainProperties(); LinksetsResponderPtr linksetsResponderPtr(new LinksetsResponder(pRequestId, pLinksetsCallback, true, doRequestTerrain)); - LLHTTPClient::ResponderPtr objectLinksetsResponder = new ObjectLinksetsResponder(objectLinksetsURL, linksetsResponderPtr); + LLHTTPClient::ResponderPtr objectLinksetsResponder = new ObjectLinksetsResponder(linksetsResponderPtr); LLHTTPClient::get(objectLinksetsURL, objectLinksetsResponder); if (doRequestTerrain) { - LLHTTPClient::ResponderPtr terrainLinksetsResponder = new TerrainLinksetsResponder(terrainLinksetsURL, linksetsResponderPtr); + LLHTTPClient::ResponderPtr terrainLinksetsResponder = new TerrainLinksetsResponder(linksetsResponderPtr); LLHTTPClient::get(terrainLinksetsURL, terrainLinksetsResponder); } } @@ -465,13 +447,13 @@ void LLPathfindingManager::requestSetLinksets(request_id_t pRequestId, const LLP if (!objectPostData.isUndefined()) { - LLHTTPClient::ResponderPtr objectLinksetsResponder = new ObjectLinksetsResponder(objectLinksetsURL, linksetsResponderPtr); + LLHTTPClient::ResponderPtr objectLinksetsResponder = new ObjectLinksetsResponder(linksetsResponderPtr); LLHTTPClient::put(objectLinksetsURL, objectPostData, objectLinksetsResponder); } if (!terrainPostData.isUndefined()) { - LLHTTPClient::ResponderPtr terrainLinksetsResponder = new TerrainLinksetsResponder(terrainLinksetsURL, linksetsResponderPtr); + LLHTTPClient::ResponderPtr terrainLinksetsResponder = new TerrainLinksetsResponder(linksetsResponderPtr); LLHTTPClient::put(terrainLinksetsURL, terrainPostData, terrainLinksetsResponder); } } @@ -504,7 +486,7 @@ void LLPathfindingManager::requestGetCharacters(request_id_t pRequestId, object_ { pCharactersCallback(pRequestId, kRequestStarted, emptyCharacterListPtr); - LLHTTPClient::ResponderPtr charactersResponder = new CharactersResponder(charactersURL, pRequestId, pCharactersCallback); + LLHTTPClient::ResponderPtr charactersResponder = new CharactersResponder(pRequestId, pCharactersCallback); LLHTTPClient::get(charactersURL, charactersResponder); } } @@ -537,7 +519,7 @@ void LLPathfindingManager::requestGetAgentState() { std::string agentStateURL = getAgentStateURLForRegion(currentRegion); llassert(!agentStateURL.empty()); - LLHTTPClient::ResponderPtr responder = new AgentStateResponder(agentStateURL); + LLHTTPClient::ResponderPtr responder = new AgentStateResponder(); LLHTTPClient::get(agentStateURL, responder); } } @@ -561,7 +543,7 @@ void LLPathfindingManager::requestRebakeNavMesh(rebake_navmesh_callback_t pRebak llassert(!navMeshStatusURL.empty()); LLSD postData; postData["command"] = "rebuild"; - LLHTTPClient::ResponderPtr responder = new NavMeshRebakeResponder(navMeshStatusURL, pRebakeNavMeshCallback); + LLHTTPClient::ResponderPtr responder = new NavMeshRebakeResponder(pRebakeNavMeshCallback); LLHTTPClient::post(navMeshStatusURL, postData, responder); } } @@ -583,7 +565,7 @@ void LLPathfindingManager::sendRequestGetNavMeshForRegion(LLPathfindingNavMeshPt else { navMeshPtr->handleNavMeshStart(pNavMeshStatus); - LLHTTPClient::ResponderPtr responder = new NavMeshResponder(navMeshURL, pNavMeshStatus.getVersion(), navMeshPtr); + LLHTTPClient::ResponderPtr responder = new NavMeshResponder(pNavMeshStatus.getVersion(), navMeshPtr); LLSD postData; LLHTTPClient::post(navMeshURL, postData, responder); @@ -797,8 +779,8 @@ void LLAgentStateChangeNode::post(ResponsePtr pResponse, const LLSD &pContext, c // NavMeshStatusResponder //--------------------------------------------------------------------------- -NavMeshStatusResponder::NavMeshStatusResponder(const std::string &pCapabilityURL, LLViewerRegion *pRegion, bool pIsGetStatusOnly) : - mCapabilityURL(pCapabilityURL), +NavMeshStatusResponder::NavMeshStatusResponder(LLViewerRegion *pRegion, bool pIsGetStatusOnly) + : mRegion(pRegion), mRegionUUID(), mIsGetStatusOnly(pIsGetStatusOnly) @@ -813,15 +795,15 @@ NavMeshStatusResponder::~NavMeshStatusResponder() { } -void NavMeshStatusResponder::httpSuccess(void) +void NavMeshStatusResponder::httpSuccess() { - LLPathfindingNavMeshStatus navMeshStatus(mRegionUUID, mContent); + LLPathfindingNavMeshStatus navMeshStatus(mRegionUUID, getContent()); LLPathfindingManager::getInstance()->handleNavMeshStatusRequest(navMeshStatus, mRegion, mIsGetStatusOnly); } -void NavMeshStatusResponder::httpFailure(void) +void NavMeshStatusResponder::httpFailure() { - llwarns << "error with request to URL '" << mCapabilityURL << "' because " << mReason << " (statusCode:" << mStatus << ")" << llendl; + llwarns << dumpResponse() << llendl; LLPathfindingNavMeshStatus navMeshStatus(mRegionUUID); LLPathfindingManager::getInstance()->handleNavMeshStatusRequest(navMeshStatus, mRegion, mIsGetStatusOnly); } @@ -830,8 +812,8 @@ void NavMeshStatusResponder::httpFailure(void) // NavMeshResponder //--------------------------------------------------------------------------- -NavMeshResponder::NavMeshResponder(const std::string &pCapabilityURL, U32 pNavMeshVersion, LLPathfindingNavMeshPtr pNavMeshPtr) : - mCapabilityURL(pCapabilityURL), +NavMeshResponder::NavMeshResponder(U32 pNavMeshVersion, LLPathfindingNavMeshPtr pNavMeshPtr) + : mNavMeshVersion(pNavMeshVersion), mNavMeshPtr(pNavMeshPtr) { @@ -841,21 +823,22 @@ NavMeshResponder::~NavMeshResponder() { } -void NavMeshResponder::httpSuccess(void) +void NavMeshResponder::httpSuccess() { - mNavMeshPtr->handleNavMeshResult(mContent, mNavMeshVersion); + mNavMeshPtr->handleNavMeshResult(getContent(), mNavMeshVersion); } -void NavMeshResponder::httpFailure(void) +void NavMeshResponder::httpFailure() { - mNavMeshPtr->handleNavMeshError(mStatus, mReason, mCapabilityURL, mNavMeshVersion); + llwarns << dumpResponse() << llendl; + mNavMeshPtr->handleNavMeshError(mNavMeshVersion); } //--------------------------------------------------------------------------- // AgentStateResponder //--------------------------------------------------------------------------- -AgentStateResponder::AgentStateResponder(const std::string &pCapabilityURL) : mCapabilityURL(pCapabilityURL) +AgentStateResponder::AgentStateResponder() { } @@ -863,17 +846,18 @@ AgentStateResponder::~AgentStateResponder() { } -void AgentStateResponder::httpSuccess(void) +void AgentStateResponder::httpSuccess() { - llassert(mContent.has(AGENT_STATE_CAN_REBAKE_REGION_FIELD)); - llassert(mContent.get(AGENT_STATE_CAN_REBAKE_REGION_FIELD).isBoolean()); - BOOL canRebakeRegion = mContent.get(AGENT_STATE_CAN_REBAKE_REGION_FIELD).asBoolean(); + const LLSD& pContent = getContent(); + llassert(pContent.has(AGENT_STATE_CAN_REBAKE_REGION_FIELD)); + llassert(pContent.get(AGENT_STATE_CAN_REBAKE_REGION_FIELD).isBoolean()); + BOOL canRebakeRegion = pContent.get(AGENT_STATE_CAN_REBAKE_REGION_FIELD).asBoolean(); LLPathfindingManager::getInstance()->handleAgentState(canRebakeRegion); } -void AgentStateResponder::httpFailure(void) +void AgentStateResponder::httpFailure() { - llwarns << "error with request to URL '" << mCapabilityURL << "' because " << mReason << " (statusCode:" << mStatus << ")" << llendl; + llwarns << dumpResponse() << llendl; LLPathfindingManager::getInstance()->handleAgentState(FALSE); } @@ -881,8 +865,8 @@ void AgentStateResponder::httpFailure(void) //--------------------------------------------------------------------------- // navmesh rebake responder //--------------------------------------------------------------------------- -NavMeshRebakeResponder::NavMeshRebakeResponder(const std::string &pCapabilityURL, LLPathfindingManager::rebake_navmesh_callback_t pRebakeNavMeshCallback) : - mCapabilityURL(pCapabilityURL), +NavMeshRebakeResponder::NavMeshRebakeResponder(LLPathfindingManager::rebake_navmesh_callback_t pRebakeNavMeshCallback) + : mRebakeNavMeshCallback(pRebakeNavMeshCallback) { } @@ -891,14 +875,14 @@ NavMeshRebakeResponder::~NavMeshRebakeResponder() { } -void NavMeshRebakeResponder::httpSuccess(void) +void NavMeshRebakeResponder::httpSuccess() { mRebakeNavMeshCallback(true); } -void NavMeshRebakeResponder::httpFailure(void) +void NavMeshRebakeResponder::httpFailure() { - llwarns << "error with request to URL '" << mCapabilityURL << "' because " << mReason << " (statusCode:" << mStatus << ")" << llendl; + llwarns << dumpResponse() << llendl; mRebakeNavMeshCallback(false); } @@ -931,9 +915,9 @@ void LinksetsResponder::handleObjectLinksetsResult(const LLSD &pContent) } } -void LinksetsResponder::handleObjectLinksetsError(U32 pStatus, const std::string &pReason, const std::string &pURL) +void LinksetsResponder::handleObjectLinksetsError() { - llwarns << "error with request to URL '" << pURL << "' because " << pReason << " (statusCode:" << pStatus << ")" << llendl; + llwarns << "LinksetsResponder object linksets error" << llendl; mObjectMessagingState = kReceivedError; if (mTerrainMessagingState != kWaiting) { @@ -952,8 +936,9 @@ void LinksetsResponder::handleTerrainLinksetsResult(const LLSD &pContent) } } -void LinksetsResponder::handleTerrainLinksetsError(U32 pStatus, const std::string &pReason, const std::string &pURL) +void LinksetsResponder::handleTerrainLinksetsError() { + llwarns << "LinksetsResponder terrain linksets error" << llendl; mTerrainMessagingState = kReceivedError; if (mObjectMessagingState != kWaiting) { @@ -987,8 +972,8 @@ void LinksetsResponder::sendCallback() // ObjectLinksetsResponder //--------------------------------------------------------------------------- -ObjectLinksetsResponder::ObjectLinksetsResponder(const std::string &pCapabilityURL, LinksetsResponderPtr pLinksetsResponsderPtr) : - mCapabilityURL(pCapabilityURL), +ObjectLinksetsResponder::ObjectLinksetsResponder(LinksetsResponderPtr pLinksetsResponsderPtr) + : mLinksetsResponsderPtr(pLinksetsResponsderPtr) { } @@ -997,22 +982,23 @@ ObjectLinksetsResponder::~ObjectLinksetsResponder() { } -void ObjectLinksetsResponder::httpSuccess(void) +void ObjectLinksetsResponder::httpSuccess() { - mLinksetsResponsderPtr->handleObjectLinksetsResult(mContent); + mLinksetsResponsderPtr->handleObjectLinksetsResult(getContent()); } -void ObjectLinksetsResponder::httpFailure(void) +void ObjectLinksetsResponder::httpFailure() { - mLinksetsResponsderPtr->handleObjectLinksetsError(mStatus, mReason, mCapabilityURL); + llwarns << dumpResponse() << llendl; + mLinksetsResponsderPtr->handleObjectLinksetsError(); } //--------------------------------------------------------------------------- // TerrainLinksetsResponder //--------------------------------------------------------------------------- -TerrainLinksetsResponder::TerrainLinksetsResponder(const std::string &pCapabilityURL, LinksetsResponderPtr pLinksetsResponsderPtr) : - mCapabilityURL(pCapabilityURL), +TerrainLinksetsResponder::TerrainLinksetsResponder(LinksetsResponderPtr pLinksetsResponsderPtr) + : mLinksetsResponsderPtr(pLinksetsResponsderPtr) { } @@ -1021,22 +1007,23 @@ TerrainLinksetsResponder::~TerrainLinksetsResponder() { } -void TerrainLinksetsResponder::httpSuccess(void) +void TerrainLinksetsResponder::httpSuccess() { - mLinksetsResponsderPtr->handleTerrainLinksetsResult(mContent); + mLinksetsResponsderPtr->handleTerrainLinksetsResult(getContent()); } -void TerrainLinksetsResponder::httpFailure(void) +void TerrainLinksetsResponder::httpFailure() { - mLinksetsResponsderPtr->handleTerrainLinksetsError(mStatus, mReason, mCapabilityURL); + llwarns << dumpResponse() << llendl; + mLinksetsResponsderPtr->handleTerrainLinksetsError(); } //--------------------------------------------------------------------------- // CharactersResponder //--------------------------------------------------------------------------- -CharactersResponder::CharactersResponder(const std::string &pCapabilityURL, LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::object_request_callback_t pCharactersCallback) : - mCapabilityURL(pCapabilityURL), +CharactersResponder::CharactersResponder(LLPathfindingManager::request_id_t pRequestId, LLPathfindingManager::object_request_callback_t pCharactersCallback) + : mRequestId(pRequestId), mCharactersCallback(pCharactersCallback) { @@ -1046,15 +1033,15 @@ CharactersResponder::~CharactersResponder() { } -void CharactersResponder::httpSuccess(void) +void CharactersResponder::httpSuccess() { - LLPathfindingObjectListPtr characterListPtr = LLPathfindingObjectListPtr(new LLPathfindingCharacterList(mContent)); + LLPathfindingObjectListPtr characterListPtr = LLPathfindingObjectListPtr(new LLPathfindingCharacterList(getContent())); mCharactersCallback(mRequestId, LLPathfindingManager::kRequestCompleted, characterListPtr); } -void CharactersResponder::httpFailure(void) +void CharactersResponder::httpFailure() { - llwarns << "error with request to URL '" << mCapabilityURL << "' because " << mReason << " (statusCode:" << mStatus << ")" << llendl; + llwarns << dumpResponse() << llendl; LLPathfindingObjectListPtr characterListPtr = LLPathfindingObjectListPtr(new LLPathfindingCharacterList()); mCharactersCallback(mRequestId, LLPathfindingManager::kRequestError, characterListPtr); diff --git a/indra/newview/llpathfindingnavmesh.cpp b/indra/newview/llpathfindingnavmesh.cpp index e01dd3a15..555105cf4 100644 --- a/indra/newview/llpathfindingnavmesh.cpp +++ b/indra/newview/llpathfindingnavmesh.cpp @@ -184,9 +184,8 @@ void LLPathfindingNavMesh::handleNavMeshError() setRequestStatus(kNavMeshRequestError); } -void LLPathfindingNavMesh::handleNavMeshError(U32 pStatus, const std::string &pReason, const std::string &pURL, U32 pNavMeshVersion) +void LLPathfindingNavMesh::handleNavMeshError(U32 pNavMeshVersion) { - llwarns << "error with request to URL '" << pURL << "' because " << pReason << " (statusCode:" << pStatus << ")" << llendl; if (mNavMeshStatus.getVersion() == pNavMeshVersion) { handleNavMeshError(); diff --git a/indra/newview/llpathfindingnavmesh.h b/indra/newview/llpathfindingnavmesh.h index 7a844f54c..87f32b8d5 100644 --- a/indra/newview/llpathfindingnavmesh.h +++ b/indra/newview/llpathfindingnavmesh.h @@ -74,7 +74,7 @@ public: void handleNavMeshResult(const LLSD &pContent, U32 pNavMeshVersion); void handleNavMeshNotEnabled(); void handleNavMeshError(); - void handleNavMeshError(U32 pStatus, const std::string &pReason, const std::string &pURL, U32 pNavMeshVersion); + void handleNavMeshError(U32 pNavMeshVersion); protected: diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index d15900993..78ce1c0bd 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -38,7 +38,6 @@ #include "llagent.h" #include "llbutton.h" #include "llcommandhandler.h" -#include "llenvmanager.h" #include "llfloaterbuycurrency.h" #include "llfloaterchat.h" #include "llfloaterinventory.h" @@ -235,7 +234,7 @@ mIsNavMeshDirty(false) LLButton* buybtn = getChild("buycurrency"); buybtn->setLabelArg("[CURRENCY]", gHippoGridManager->getConnectedGrid()->getCurrencySymbol()); - mRegionCrossingSlot = LLEnvManagerNew::getInstance()->setRegionChangeCallback(boost::bind(&LLStatusBar::createNavMeshStatusListenerForCurrentRegion, this)); + mRegionCrossingSlot = gAgent.addRegionChangedCallback(boost::bind(&LLStatusBar::createNavMeshStatusListenerForCurrentRegion, this)); createNavMeshStatusListenerForCurrentRegion(); // Adding Net Stat Graph diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index 5104f7972..dd31b6990 100644 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -45,7 +45,6 @@ #include "lltoolfocus.h" #include "llviewerwindow.h" #include "llvoavatarself.h" -#include "lllslconstants.h" // // Constants @@ -59,6 +58,11 @@ const S32 NUDGE_FRAMES = 2; const F32 ORBIT_NUDGE_RATE = 0.05f; // fraction of normal speed const F32 YAW_NUDGE_RATE = 0.05f; // fraction of normal speed +struct LLKeyboardActionRegistry +: public LLRegistrySingleton, LLKeyboardActionRegistry> +{ +}; + LLViewerKeyboard gViewerKeyboard; void agent_jump( EKeystate s ) @@ -66,6 +70,7 @@ void agent_jump( EKeystate s ) if( KEYSTATE_UP == s ) return; F32 time = gKeyboard->getCurKeyElapsedTime(); S32 frame_count = llround(gKeyboard->getCurKeyElapsedFrameCount()); + if( time < FLY_TIME || frame_count <= FLY_FRAMES || gAgent.upGrabbed() @@ -81,9 +86,9 @@ void agent_jump( EKeystate s ) } void agent_toggle_down( EKeystate s ) { - if(KEYSTATE_UP == s) return; - - if(KEYSTATE_DOWN == s && !gAgent.getFlying() && gSavedSettings.getBOOL("SGShiftCrouchToggle")) + if (KEYSTATE_UP == s) return; + + if (KEYSTATE_DOWN == s && !gAgent.getFlying() && gSavedSettings.getBOOL("SGShiftCrouchToggle")) { gAgent.toggleCrouch(); } @@ -242,7 +247,7 @@ void agent_toggle_fly( EKeystate s ) // Only catch the edge if (KEYSTATE_DOWN == s ) { - gAgent.toggleFlying(); + LLAgent::toggleFlying(); } } @@ -252,7 +257,7 @@ F32 get_orbit_rate() if( time < NUDGE_TIME ) { F32 rate = ORBIT_NUDGE_RATE + time * (1 - ORBIT_NUDGE_RATE)/ NUDGE_TIME; - //llinfos << rate << llendl; + //LL_INFOS() << rate << LL_ENDL; return rate; } else @@ -517,6 +522,11 @@ void stop_moving( EKeystate s ) void start_chat( EKeystate s ) { + if (LLAppViewer::instance()->quitRequested()) + { + return; // can't talk, gotta go, kthxbye! + } + // start chat gChatBar->startChat(NULL); } @@ -540,53 +550,51 @@ void start_gesture( EKeystate s ) } } -void bind_keyboard_functions() -{ - gViewerKeyboard.bindNamedFunction("jump", agent_jump); - gViewerKeyboard.bindNamedFunction("push_down", agent_push_down); - gViewerKeyboard.bindNamedFunction("push_forward", agent_push_forward); - gViewerKeyboard.bindNamedFunction("push_backward", agent_push_backward); - gViewerKeyboard.bindNamedFunction("look_up", agent_look_up); - gViewerKeyboard.bindNamedFunction("look_down", agent_look_down); - gViewerKeyboard.bindNamedFunction("toggle_down", agent_toggle_down); - gViewerKeyboard.bindNamedFunction("toggle_fly", agent_toggle_fly); - gViewerKeyboard.bindNamedFunction("turn_left", agent_turn_left); - gViewerKeyboard.bindNamedFunction("turn_right", agent_turn_right); - gViewerKeyboard.bindNamedFunction("slide_left", agent_slide_left); - gViewerKeyboard.bindNamedFunction("slide_right", agent_slide_right); - gViewerKeyboard.bindNamedFunction("spin_around_ccw", camera_spin_around_ccw); - gViewerKeyboard.bindNamedFunction("spin_around_cw", camera_spin_around_cw); - gViewerKeyboard.bindNamedFunction("spin_around_ccw_sitting", camera_spin_around_ccw_sitting); - gViewerKeyboard.bindNamedFunction("spin_around_cw_sitting", camera_spin_around_cw_sitting); - gViewerKeyboard.bindNamedFunction("spin_over", camera_spin_over); - gViewerKeyboard.bindNamedFunction("spin_under", camera_spin_under); - gViewerKeyboard.bindNamedFunction("spin_over_sitting", camera_spin_over_sitting); - gViewerKeyboard.bindNamedFunction("spin_under_sitting", camera_spin_under_sitting); - gViewerKeyboard.bindNamedFunction("move_forward", camera_move_forward); - gViewerKeyboard.bindNamedFunction("move_backward", camera_move_backward); - gViewerKeyboard.bindNamedFunction("move_forward_sitting", camera_move_forward_sitting); - gViewerKeyboard.bindNamedFunction("move_backward_sitting", camera_move_backward_sitting); - gViewerKeyboard.bindNamedFunction("pan_up", camera_pan_up); - gViewerKeyboard.bindNamedFunction("pan_down", camera_pan_down); - gViewerKeyboard.bindNamedFunction("pan_left", camera_pan_left); - gViewerKeyboard.bindNamedFunction("pan_right", camera_pan_right); - gViewerKeyboard.bindNamedFunction("pan_in", camera_pan_in); - gViewerKeyboard.bindNamedFunction("pan_out", camera_pan_out); - gViewerKeyboard.bindNamedFunction("move_forward_fast", camera_move_forward_fast); - gViewerKeyboard.bindNamedFunction("move_backward_fast", camera_move_backward_fast); - gViewerKeyboard.bindNamedFunction("edit_avatar_spin_ccw", edit_avatar_spin_ccw); - gViewerKeyboard.bindNamedFunction("edit_avatar_spin_cw", edit_avatar_spin_cw); - gViewerKeyboard.bindNamedFunction("edit_avatar_spin_over", edit_avatar_spin_over); - gViewerKeyboard.bindNamedFunction("edit_avatar_spin_under", edit_avatar_spin_under); - gViewerKeyboard.bindNamedFunction("edit_avatar_move_forward", edit_avatar_move_forward); - gViewerKeyboard.bindNamedFunction("edit_avatar_move_backward", edit_avatar_move_backward); - gViewerKeyboard.bindNamedFunction("stop_moving", stop_moving); - gViewerKeyboard.bindNamedFunction("start_chat", start_chat); - gViewerKeyboard.bindNamedFunction("start_gesture", start_gesture); -} +#define REGISTER_KEYBOARD_ACTION(KEY, ACTION) LLREGISTER_STATIC(LLKeyboardActionRegistry, KEY, ACTION); +REGISTER_KEYBOARD_ACTION("jump", agent_jump); +REGISTER_KEYBOARD_ACTION("push_down", agent_push_down); +REGISTER_KEYBOARD_ACTION("push_forward", agent_push_forward); +REGISTER_KEYBOARD_ACTION("push_backward", agent_push_backward); +REGISTER_KEYBOARD_ACTION("look_up", agent_look_up); +REGISTER_KEYBOARD_ACTION("look_down", agent_look_down); +REGISTER_KEYBOARD_ACTION("toggle_down", agent_toggle_down); +REGISTER_KEYBOARD_ACTION("toggle_fly", agent_toggle_fly); +REGISTER_KEYBOARD_ACTION("turn_left", agent_turn_left); +REGISTER_KEYBOARD_ACTION("turn_right", agent_turn_right); +REGISTER_KEYBOARD_ACTION("slide_left", agent_slide_left); +REGISTER_KEYBOARD_ACTION("slide_right", agent_slide_right); +REGISTER_KEYBOARD_ACTION("spin_around_ccw", camera_spin_around_ccw); +REGISTER_KEYBOARD_ACTION("spin_around_cw", camera_spin_around_cw); +REGISTER_KEYBOARD_ACTION("spin_around_ccw_sitting", camera_spin_around_ccw_sitting); +REGISTER_KEYBOARD_ACTION("spin_around_cw_sitting", camera_spin_around_cw_sitting); +REGISTER_KEYBOARD_ACTION("spin_over", camera_spin_over); +REGISTER_KEYBOARD_ACTION("spin_under", camera_spin_under); +REGISTER_KEYBOARD_ACTION("spin_over_sitting", camera_spin_over_sitting); +REGISTER_KEYBOARD_ACTION("spin_under_sitting", camera_spin_under_sitting); +REGISTER_KEYBOARD_ACTION("move_forward", camera_move_forward); +REGISTER_KEYBOARD_ACTION("move_backward", camera_move_backward); +REGISTER_KEYBOARD_ACTION("move_forward_sitting", camera_move_forward_sitting); +REGISTER_KEYBOARD_ACTION("move_backward_sitting", camera_move_backward_sitting); +REGISTER_KEYBOARD_ACTION("pan_up", camera_pan_up); +REGISTER_KEYBOARD_ACTION("pan_down", camera_pan_down); +REGISTER_KEYBOARD_ACTION("pan_left", camera_pan_left); +REGISTER_KEYBOARD_ACTION("pan_right", camera_pan_right); +REGISTER_KEYBOARD_ACTION("pan_in", camera_pan_in); +REGISTER_KEYBOARD_ACTION("pan_out", camera_pan_out); +REGISTER_KEYBOARD_ACTION("move_forward_fast", camera_move_forward_fast); +REGISTER_KEYBOARD_ACTION("move_backward_fast", camera_move_backward_fast); +REGISTER_KEYBOARD_ACTION("edit_avatar_spin_ccw", edit_avatar_spin_ccw); +REGISTER_KEYBOARD_ACTION("edit_avatar_spin_cw", edit_avatar_spin_cw); +REGISTER_KEYBOARD_ACTION("edit_avatar_spin_over", edit_avatar_spin_over); +REGISTER_KEYBOARD_ACTION("edit_avatar_spin_under", edit_avatar_spin_under); +REGISTER_KEYBOARD_ACTION("edit_avatar_move_forward", edit_avatar_move_forward); +REGISTER_KEYBOARD_ACTION("edit_avatar_move_backward", edit_avatar_move_backward); +REGISTER_KEYBOARD_ACTION("stop_moving", stop_moving); +REGISTER_KEYBOARD_ACTION("start_chat", start_chat); +REGISTER_KEYBOARD_ACTION("start_gesture", start_gesture); +#undef REGISTER_KEYBOARD_ACTION -LLViewerKeyboard::LLViewerKeyboard() : - mNamedFunctionCount(0) +LLViewerKeyboard::LLViewerKeyboard() { for (S32 i = 0; i < MODE_COUNT; i++) { @@ -604,16 +612,6 @@ LLViewerKeyboard::LLViewerKeyboard() : } } - -void LLViewerKeyboard::bindNamedFunction(const std::string& name, LLKeyFunc func) -{ - S32 i = mNamedFunctionCount; - mNamedFunctions[i].mName = name; - mNamedFunctions[i].mFunction = func; - mNamedFunctionCount++; -} - - BOOL LLViewerKeyboard::modeFromString(const std::string& string, S32 *mode) { if (string == "FIRST_PERSON") @@ -667,17 +665,21 @@ BOOL LLViewerKeyboard::handleKey(KEY translated_key, MASK translated_mask, BOOL return FALSE; } - lldebugst(LLERR_USER_INPUT) << "keydown -" << translated_key << "-" << llendl; + LL_DEBUGS("UserInput") << "keydown -" << translated_key << "-" << LL_ENDL; // skip skipped keys if(mKeysSkippedByUI.find(translated_key) != mKeysSkippedByUI.end()) { mKeyHandledByUI[translated_key] = FALSE; + LL_INFOS("Keyboard Handling") << "Key wasn't handled by UI!" << LL_ENDL; } else { // it is sufficient to set this value once per call to handlekey // without clearing it, as it is only used in the subsequent call to scanKey mKeyHandledByUI[translated_key] = gViewerWindow->handleKey(translated_key, translated_mask); + // mKeyHandledByUI is not what you think ... this indicates whether the UI has handled this keypress yet (any keypress) + // NOT whether some UI shortcut wishes to handle the keypress + } return mKeyHandledByUI[translated_key]; } @@ -686,8 +688,9 @@ BOOL LLViewerKeyboard::handleKey(KEY translated_key, MASK translated_mask, BOOL BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name) { - S32 i,index; - void (*function)(EKeystate keystate) = NULL; + S32 index; + typedef boost::function function_t; + function_t function = NULL; std::string name; // Allow remapping of F2-F12 @@ -710,13 +713,11 @@ BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, c } // Not remapped, look for a function - for (i = 0; i < mNamedFunctionCount; i++) + + function_t* result = LLKeyboardActionRegistry::getValue(function_name); + if (result) { - if (function_name == mNamedFunctions[i].mName) - { - function = mNamedFunctions[i].mFunction; - name = mNamedFunctions[i].mName; - } + function = *result; } if (!function) @@ -740,13 +741,12 @@ BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, c if (mode >= MODE_COUNT) { - llerror("LLKeyboard::bindKey() - unknown mode passed", mode); + llerrs << "LLKeyboard::bindKey() - unknown mode passed" << mode << llendl; return FALSE; } mBindings[mode][index].mKey = key; mBindings[mode][index].mMask = mask; -// mBindings[mode][index].mName = name; mBindings[mode][index].mFunction = function; if (index == mBindingCount[mode]) @@ -911,18 +911,18 @@ void LLViewerKeyboard::scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_lev if (key_down && !repeat) { // ...key went down this frame, call function - (*binding[i].mFunction)( KEYSTATE_DOWN ); + binding[i].mFunction( KEYSTATE_DOWN ); } else if (key_up) { // ...key went down this frame, call function - (*binding[i].mFunction)( KEYSTATE_UP ); + binding[i].mFunction( KEYSTATE_UP ); } else if (key_level) { // ...key held down from previous frame // Not windows, just call the function. - (*binding[i].mFunction)( KEYSTATE_LEVEL ); + binding[i].mFunction( KEYSTATE_LEVEL ); }//if }//if }//for diff --git a/indra/newview/llviewerkeyboard.h b/indra/newview/llviewerkeyboard.h index 56a31b18d..1893b6aee 100644 --- a/indra/newview/llviewerkeyboard.h +++ b/indra/newview/llviewerkeyboard.h @@ -61,7 +61,6 @@ typedef enum e_keyboard_mode void bind_keyboard_functions(); - class LLViewerKeyboard { public: @@ -69,10 +68,8 @@ public: BOOL handleKey(KEY key, MASK mask, BOOL repeated); - void bindNamedFunction(const std::string& name, LLKeyFunc func); - S32 loadBindings(const std::string& filename); // returns number bound, 0 on error - void unloadBindings(); + void unloadBindings(); EKeyboardMode getMode(); BOOL modeFromString(const std::string& string, S32 *mode); // False on failure @@ -80,8 +77,6 @@ public: void scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level); protected: BOOL bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name); - S32 mNamedFunctionCount; - LLNamedFunction mNamedFunctions[MAX_NAMED_FUNCTIONS]; // Hold all the ugly stuff torn out to make LLKeyboard non-viewer-specific here S32 mBindingCount[MODE_COUNT]; @@ -95,4 +90,5 @@ protected: extern LLViewerKeyboard gViewerKeyboard; void agent_push_forward(EKeystate s); + #endif // LL_LLVIEWERKEYBOARD_H diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index fd3346160..d9c88d91e 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -755,7 +755,7 @@ void init_menus() ins = gMenuBarView->getChildView("insert_admin", true, false); ins->setVisible(false);*/ - LLEnvManagerNew::instance().setRegionChangeCallback(®ion_change); + gAgent.addRegionChangedCallback(®ion_change); } diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index d1714d960..37ed70519 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -657,13 +657,14 @@ bool join_group_response(const LLSD& notification, const LLSD& response) LLNotificationsUtil::add("JoinGroup", args, notification["payload"]); return false; } + if(option == 0 && !group_id.isNull()) { // check for promotion or demotion. S32 max_groups = gHippoLimits->getMaxAgentGroups(); if(gAgent.isInGroup(group_id)) ++max_groups; - if(gAgent.mGroups.count() < max_groups) + if((S32)gAgent.mGroups.size() < max_groups) { accept_invite = true; } diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index cbc64d533..799513e93 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -358,6 +358,10 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, // Create the object lists initStats(); initPartitions(); + // If the newly entered region is using server bakes, and our + // current appearance is non-baked, request appearance update from + // server. + setCapabilitiesReceivedCallback(boost::bind(&LLAgent::handleServerBakeRegionTransition, &gAgent, _1)); // Singu TODO: LLAvatarRenderInfoAccountant } void LLViewerRegion::initPartitions() diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 802105235..9e20f8ab8 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -111,7 +111,6 @@ #include "llsdutil.h" #include "llfloaterexploreanimations.h" -#include "aihttptimeoutpolicy.h" #include "aixmllindengenepool.h" #include "aifile.h" @@ -5033,7 +5032,7 @@ void LLVOAvatar::bakedTextureOriginCounts(S32 &sb_count, // server-bake, has ori std::string LLVOAvatar::bakedTextureOriginInfo() { std::string result; - + std::set baked_ids; collectBakedTextureUUIDs(baked_ids); for (std::set::const_iterator it = baked_ids.begin(); it != baked_ids.end(); ++it) @@ -5048,11 +5047,17 @@ std::string LLVOAvatar::bakedTextureOriginInfo() { has_host = true; } - if (has_url && !has_host) result += "u"; // server-bake texture with url - else if (has_host && !has_url) result += "h"; // old-style texture on sim - else if (has_host && has_url) result += "?"; // both origins? - else if (!has_host && !has_url) result += "n"; // no origin? + S32 discard = imagep->getDiscardLevel(); + if (has_url && !has_host) result += discard ? "u" : "U"; // server-bake texture with url + else if (has_host && !has_url) result += discard ? "h" : "H"; // old-style texture on sim + else if (has_host && has_url) result += discard ? "x" : "X"; // both origins? + else if (!has_host && !has_url) result += discard ? "n" : "N"; // no origin? + if (discard != 0) + { + result += llformat("(%d/%d)",discard,imagep->getDesiredDiscardLevel()); + } } + return result; } @@ -5177,7 +5182,7 @@ void LLVOAvatar::updateTextures() BOOL render_avatar = TRUE; - if (mIsDummy || gNoRender) + if (mIsDummy) { return; } @@ -5197,6 +5202,7 @@ void LLVOAvatar::updateTextures() } std::vector layer_baked; + // GL NOT ACTIVE HERE - *TODO for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { layer_baked.push_back(isTextureDefined(mBakedTextureDatas[i].mTextureIndex)); @@ -5401,7 +5407,7 @@ const std::string LLVOAvatar::getImageURL(const U8 te, const LLUUID &uuid) std::string url = ""; if (isUsingServerBakes()) { - const std::string& appearance_service_url = gSavedSettings.getString("AgentAppearanceServiceURL"); + const std::string& appearance_service_url = LLAppearanceMgr::instance().getAppearanceServiceURL(); if (appearance_service_url.empty()) { // Probably a server-side issue if we get here: @@ -5488,8 +5494,6 @@ const LLUUID& LLVOAvatar::getStepSound() const //----------------------------------------------------------------------------- void LLVOAvatar::processAnimationStateChanges() { - if (gNoRender) return; - if ( isAnyAnimationSignaled(AGENT_WALK_ANIMS, NUM_AGENT_WALK_ANIMS) ) { startMotion(ANIM_AGENT_WALK_ADJUST); @@ -5518,7 +5522,7 @@ void LLVOAvatar::processAnimationStateChanges() } // clear all current animations - BOOL const AOEnabled = gSavedSettings.getBOOL("AOEnabled"); // Singu note: put this outside the loop. + const bool AOEnabled(gSavedSettings.getBOOL("AOEnabled")); // AnimIterator anim_it; for (anim_it = mPlayingAnimations.begin(); anim_it != mPlayingAnimations.end();) { @@ -5527,14 +5531,8 @@ void LLVOAvatar::processAnimationStateChanges() // playing, but not signaled, so stop if (found_anim == mSignaledAnimations.end()) { - if (AOEnabled && isSelf()) - { - if (LLFloaterAO::stopMotion(anim_it->first, FALSE)) // if the AO replaced this anim serverside then stop it serverside - { -// return TRUE; //no local stop needed - } - } + LLFloaterAO::stopMotion(anim_it->first, FALSE); // if the AO replaced this anim serverside then stop it serverside processSingleAnimationStateChange(anim_it->first, FALSE); // @@ -5877,29 +5875,6 @@ LLJoint *LLVOAvatar::getJoint( const std::string &name ) return jointp; } - -//----------------------------------------------------------------------------- -// resetSpecificJointPosition -//----------------------------------------------------------------------------- -void LLVOAvatar::resetSpecificJointPosition( const std::string& name ) -{ - LLJoint* pJoint = mRoot->findJoint( name ); - - if ( pJoint && pJoint->doesJointNeedToBeReset() ) - { - pJoint->restoreOldXform(); - pJoint->setId( LLUUID::null ); - //If we're reseting the pelvis position make sure not to apply offset - if ( name == "mPelvis" ) - { - mHasPelvisOffset = false; - } - } - else - { - llinfos<<"Did not find "<< name.c_str()<doesJointNeedToBeReset() ) + //Reset joints except for pelvis + if ( pJoint && pJoint != pJointPelvis && pJoint->doesJointNeedToBeReset() ) { pJoint->setId( LLUUID::null ); - //restore joints to default positions, however skip over the pelvis - // *TODO: How does this pointer check skip over pelvis? - if ( pJoint ) - { - pJoint->restoreOldXform(); - } + pJoint->restoreOldXform(); + } + else + if ( pJoint && pJoint == pJointPelvis && pJoint->doesJointNeedToBeReset() ) + { + pJoint->setId( LLUUID::null ); + pJoint->setPosition( LLVector3( 0.0f, 0.0f, 0.0f) ); + //pJoint->setJointResetFlag( false ); // Singu TODO } } + //make sure we don't apply the joint offset mHasPelvisOffset = false; mPelvisFixup = mLastPelvisFixup; @@ -5977,7 +5959,7 @@ void LLVOAvatar::getGround(const LLVector3 &in_pos_agent, LLVector3 &out_pos_age LLVector3d z_vec(0.0f, 0.0f, 1.0f); LLVector3d p0_global, p1_global; - if (gNoRender || mIsDummy) + if (mIsDummy) { outNorm.setVec(z_vec); out_pos_agent = in_pos_agent; @@ -6136,11 +6118,6 @@ BOOL LLVOAvatar::loadSkeletonNode () //----------------------------------------------------------------------------- void LLVOAvatar::updateVisualParams() { - if (gNoRender) - { - return; - } - setSex( (getVisualParamWeight( "male" ) > 0.5f) ? SEX_MALE : SEX_FEMALE ); LLCharacter::updateVisualParams(); @@ -6155,7 +6132,6 @@ void LLVOAvatar::updateVisualParams() dirtyMesh(); updateHeadOffset(); } - //----------------------------------------------------------------------------- // isActive() //----------------------------------------------------------------------------- @@ -6214,7 +6190,6 @@ BOOL LLVOAvatar::updateJointLODs() F32 avatar_num_factor = clamp_rescale((F32)sNumVisibleAvatars, 8, 25, 1.f, avatar_num_min_factor); F32 area_scale = 0.16f; - { if (isSelf()) { if(gAgentCamera.cameraCustomizeAvatar() || gAgentCamera.cameraMouselook()) @@ -6249,7 +6224,6 @@ BOOL LLVOAvatar::updateJointLODs() dirtyMesh(2); return TRUE; } - } return FALSE; } @@ -6378,19 +6352,18 @@ void LLVOAvatar::addChild(LLViewerObject *childp) LLViewerObject::addChild(childp); if (childp->mDrawable) { - if(isSelf()) + if (!attachObject(childp)) { - LL_INFOS("Attachment") << childp->getID() << " ("<getAttachmentPointName()<<") attached." << llendl; - llassert(std::find(mPendingAttachment.begin(), mPendingAttachment.end(), childp) == mPendingAttachment.end()); + llwarns << "addChild() failed for " + << childp->getID() + << " item " << childp->getAttachmentItemID() + << llendl; + // MAINT-3312 backout + // mPendingAttachment.push_back(childp); } - attachObject(childp); } else { - if(isSelf()) - { - LL_INFOS("Attachment") << childp->getID() << " ("<getAttachmentPointName()<<") pending." << llendl; - } mPendingAttachment.push_back(childp); } } @@ -6519,17 +6492,22 @@ void LLVOAvatar::lazyAttach() for (U32 i = 0; i < mPendingAttachment.size(); i++) { - if (mPendingAttachment[i]->mDrawable) + LLPointer cur_attachment = mPendingAttachment[i]; + if (cur_attachment->mDrawable) { - if(isSelf()) - { - LL_INFOS("Attachment") << mPendingAttachment[i]->getID() << " ("<getAttachmentPointName()<<") done pending. attached." << llendl; + if(!attachObject(cur_attachment)) + { // Drop it + llwarns << "attachObject() failed for " + << cur_attachment->getID() + << " item " << cur_attachment->getAttachmentItemID() + << llendl; + // MAINT-3312 backout + //still_pending.push_back(cur_attachment); } - attachObject(mPendingAttachment[i]); } else { - still_pending.push_back(mPendingAttachment[i]); + still_pending.push_back(cur_attachment); } } @@ -6538,6 +6516,7 @@ void LLVOAvatar::lazyAttach() void LLVOAvatar::resetHUDAttachments() { + for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); iter != mAttachmentPoints.end(); ++iter) @@ -6612,6 +6591,7 @@ void LLVOAvatar::cleanupAttachedMesh( LLViewerObject* pVO ) //----------------------------------------------------------------------------- BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object) { + for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); iter != mAttachmentPoints.end(); ++iter) @@ -6623,6 +6603,7 @@ BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object) vector_replace_with_last(mAttachedObjectsVector,std::make_pair(viewer_object,attachment)); cleanupAttachedMesh( viewer_object ); + attachment->removeObject(viewer_object); lldebugs << "Detaching object " << viewer_object->mID << " from " << attachment->getName() << llendl; return TRUE; @@ -7037,9 +7018,12 @@ void LLVOAvatar::clearPhases() void LLVOAvatar::startPhase(const std::string& phase_name) { - F32 elapsed; - bool completed; - if (getPhases().getPhaseValues(phase_name, elapsed, completed)) + F32 elapsed = 0.0; + bool completed = false; + bool found = getPhases().getPhaseValues(phase_name, elapsed, completed); + //LL_DEBUGS("Avatar") << avString() << " phase state " << phase_name + // << " found " << found << " elapsed " << elapsed << " completed " << completed << LL_ENDL; + if (found) { if (!completed) { @@ -7053,8 +7037,8 @@ void LLVOAvatar::startPhase(const std::string& phase_name) void LLVOAvatar::stopPhase(const std::string& phase_name, bool err_check) { - F32 elapsed; - bool completed; + F32 elapsed = 0.0; + bool completed = false; if (getPhases().getPhaseValues(phase_name, elapsed, completed)) { if (!completed) @@ -7240,8 +7224,8 @@ BOOL LLVOAvatar::isFullyLoaded() const bool LLVOAvatar::isTooComplex() const { - static const LLCachedControl render_avatar_complexity_limit("RenderAvatarComplexityLimit",0); - if (render_avatar_complexity_limit > 0 && mVisualComplexity >= render_avatar_complexity_limit) + static LLCachedControl ava_complexity_limit(gSavedSettings, "RenderAvatarComplexityLimit"); + if (ava_complexity_limit > 0 && mVisualComplexity >= ava_complexity_limit) { return true; } @@ -7262,7 +7246,8 @@ LLMotion* LLVOAvatar::findMotion(const LLUUID& id) const // colorized if using deferred rendering. void LLVOAvatar::debugColorizeSubMeshes(U32 i, const LLColor4& color) { - if (gSavedSettings.getBOOL("DebugAvatarCompositeBaked")) + static LLCachedControl debug_avatar_comp_baked(gSavedSettings, "DebugAvatarCompositeBaked"); + if (debug_avatar_comp_baked) { avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin(); avatar_joint_mesh_list_t::iterator end = mBakedTextureDatas[i].mJointMeshes.end(); @@ -7278,6 +7263,7 @@ void LLVOAvatar::debugColorizeSubMeshes(U32 i, const LLColor4& color) } } } + //----------------------------------------------------------------------------- // updateMeshTextures() // Uses the current TE values to set the meshes' and layersets' textures. @@ -7592,7 +7578,6 @@ void LLVOAvatar::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_com } } - // returns TRUE if morph masks are present and not valid for a given baked texture, FALSE otherwise BOOL LLVOAvatar::morphMaskNeedsUpdate(LLAvatarAppearanceDefines::EBakedTextureIndex index) { @@ -7775,7 +7760,7 @@ LLBBox LLVOAvatar::getHUDBBox() const //----------------------------------------------------------------------------- void LLVOAvatar::onFirstTEMessageReceived() { - LL_INFOS("Avatar") << avString() << LL_ENDL; + LL_DEBUGS("Avatar") << avString() << LL_ENDL; if( !mFirstTEMessageReceived ) { mFirstTEMessageReceived = TRUE; @@ -8017,13 +8002,13 @@ bool resolve_appearance_version(const LLAppearanceMessageContents& contents, S32 { appearance_version = contents.mParamAppearanceVersion; } - if (contents.mAppearanceVersion >= 0) + else if (contents.mAppearanceVersion > 0) { appearance_version = contents.mAppearanceVersion; } - if (appearance_version < 0) // still not set, go with 0. + else // still not set, go with 1. { - appearance_version = 0; + appearance_version = 1; } LL_DEBUGS("Avatar") << "appearance version info - field " << contents.mAppearanceVersion << " param: " << contents.mParamAppearanceVersion @@ -8061,6 +8046,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) llwarns << "bad appearance version info, discarding" << llendl; return; } + S32 this_update_cof_version = contents.mCOFVersion; S32 last_update_request_cof_version = LLAppearanceMgr::instance().mLastUpdateRequestCOFVersion; @@ -8108,6 +8094,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) return; } + // SUNSHINE CLEANUP - is this case OK now? S32 num_params = contents.mParamWeights.size(); if (num_params <= 1) { @@ -8132,9 +8119,15 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) && mBakedTextureDatas[baked_index].mLastTextureID != IMG_DEFAULT && baked_index != BAKED_SKIRT) { + LL_DEBUGS("Avatar") << avString() << " baked_index " << (S32) baked_index << " using mLastTextureID " << mBakedTextureDatas[baked_index].mLastTextureID << LL_ENDL; setTEImage(mBakedTextureDatas[baked_index].mTextureIndex, LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureID, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); } + else + { + LL_DEBUGS("Avatar") << avString() << " baked_index " << (S32) baked_index << " using texture id " + << getTE(mBakedTextureDatas[baked_index].mTextureIndex)->getID() << LL_ENDL; + } } // runway - was @@ -8162,6 +8155,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) LL_DEBUGS("Avatar") << avString() << " handle visual params, num_params " << num_params << LL_ENDL; BOOL params_changed = FALSE; BOOL interp_params = FALSE; + S32 params_changed_count = 0; for( S32 i = 0; i < num_params; i++ ) { @@ -8176,8 +8170,11 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) if (is_first_appearance_message || (param->getWeight() != newWeight)) { params_changed = TRUE; + params_changed_count++; + if(is_first_appearance_message) { + //LL_DEBUGS("Avatar") << "param slam " << i << " " << newWeight << LL_ENDL; param->setWeight(newWeight, FALSE); } else @@ -8193,6 +8190,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) LL_DEBUGS("Avatar") << "Number of params in AvatarAppearance msg (" << num_params << ") does not match number of tweakable params in avatar xml file (" << expected_tweakable_count << "). Processing what we can. object: " << getID() << LL_ENDL; } + LL_DEBUGS("Avatar") << "Changed " << params_changed_count << " params" << LL_ENDL; if (params_changed) { if (interp_params) @@ -8242,35 +8240,36 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) } updateMeshTextures(); - //if (enable_verbose_dumps) dumpArchetypeXML(dump_prefix + "process_end"); } // static -void LLVOAvatar::getAnimLabels( LLDynamicArray* labels ) +void LLVOAvatar::getAnimLabels( std::vector* labels ) { S32 i; + labels->reserve(gUserAnimStatesCount); for( i = 0; i < gUserAnimStatesCount; i++ ) { - labels->put( LLAnimStateLabels::getStateLabel( gUserAnimStates[i].mName ) ); + labels->push_back( LLAnimStateLabels::getStateLabel( gUserAnimStates[i].mName ) ); } // Special case to trigger away (AFK) state - labels->put( "Away From Keyboard" ); + labels->push_back( "Away From Keyboard" ); } // static -void LLVOAvatar::getAnimNames( LLDynamicArray* names ) +void LLVOAvatar::getAnimNames( std::vector* names ) { S32 i; + names->reserve(gUserAnimStatesCount); for( i = 0; i < gUserAnimStatesCount; i++ ) { - names->put( std::string(gUserAnimStates[i].mName) ); + names->push_back( std::string(gUserAnimStates[i].mName) ); } // Special case to trigger away (AFK) state - names->put( "enter_away_from_keyboard_state" ); + names->push_back( "enter_away_from_keyboard_state" ); } // static @@ -8423,7 +8422,7 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id ) LLViewerTexture* image_baked = getImage( mBakedTextureDatas[i].mTextureIndex, 0 ); if (id == image_baked->getID()) { - LL_DEBUGS("Avatar") << avString() << " i " << i << " id " << id << LL_ENDL; + //LL_DEBUGS("Avatar") << avString() << " i " << i << " id " << id << LL_ENDL; mBakedTextureDatas[i].mIsLoaded = true; mBakedTextureDatas[i].mLastTextureID = id; mBakedTextureDatas[i].mIsUsed = true; @@ -8496,6 +8495,15 @@ std::string get_sequential_numbered_file_name(const std::string& prefix, return outfilename; } +void dump_sequential_xml(const std::string outprefix, const LLSD& content) +{ + std::string outfilename = get_sequential_numbered_file_name(outprefix,".xml"); + std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,outfilename); + std::ofstream ofs(fullpath.c_str(), std::ios_base::out); + ofs << LLSDOStreamer(content, LLSDFormatter::OPTIONS_PRETTY); + LL_DEBUGS("Avatar") << "results saved to: " << fullpath << LL_ENDL; +} + void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_wearables ) { std::string outprefix(prefix); diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index b0bc08ab3..6dd1f0b71 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -250,7 +250,6 @@ public: virtual LLJoint* getJoint(const std::string &name); void resetJointPositionsToDefault( void ); - void resetSpecificJointPosition( const std::string& name ); /*virtual*/ const LLUUID& getID() const; /*virtual*/ void addDebugText(const std::string& text); @@ -916,11 +915,11 @@ private: **/ public: - /*virtual*/ std::string getFullname() const; // Returns "FirstName LastName" + std::string getFullname() const; // Returns "FirstName LastName" std::string avString() const; // Frequently used string in log messages "Avatar '* labels); - static void getAnimNames(LLDynamicArray* names); + static void getAnimLabels(std::vector* labels); + static void getAnimNames(std::vector* names); private: std::string mNameString; // UTF-8 title + name + status std::string mTitle; @@ -1074,8 +1073,10 @@ private: // }; // LLVOAvatar - extern const F32 SELF_ADDITIONAL_PRI; extern const S32 MAX_TEXTURE_VIRTUAL_SIZE_RESET_INTERVAL; +void dump_sequential_xml(const std::string outprefix, const LLSD& content); + #endif // LL_VOAVATAR_H + diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index f5cf396c3..c77914e36 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -620,12 +620,21 @@ void LLVOAvatarSelf::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) // virtual LLJoint *LLVOAvatarSelf::getJoint(const std::string &name) { - if (mScreenp) + // - findJoint Opt + LLJoint* jointp = LLVOAvatar::getJoint(name); + if (!jointp && mScreenp) { - LLJoint* jointp = mScreenp->findJoint(name); - if (jointp) return jointp; + jointp = mScreenp->findJoint(name); } - return LLVOAvatar::getJoint(name); + return jointp; + + // + //if (mScreenp) + //{ + // LLJoint* jointp = mScreenp->findJoint(name); + // if (jointp) return jointp; + //} + //return LLVOAvatar::getJoint(name); } // virtual BOOL LLVOAvatarSelf::setVisualParamWeight(const LLVisualParam *which_param, F32 weight, BOOL upload_bake ) @@ -663,14 +672,6 @@ BOOL LLVOAvatarSelf::setParamWeight(const LLViewerVisualParam *param, F32 weight return FALSE; } -#if 0 - // FIXME DRANO - kludgy way to avoid overwriting avatar state from wearables. - if (isUsingServerBakes() && !isUsingLocalAppearance()) - { - return FALSE; - } -#endif - if (param->getCrossWearable()) { LLWearableType::EType type = (LLWearableType::EType)param->getWearableType(); @@ -741,50 +742,9 @@ void LLVOAvatarSelf::stopMotionFromSource(const LLUUID& source_id) } //virtual -U32 LLVOAvatarSelf::processUpdateMessage(LLMessageSystem *mesgsys, - void **user_data, - U32 block_num, - const EObjectUpdateType update_type, - LLDataPacker *dp) +U32 LLVOAvatarSelf::processUpdateMessage(LLMessageSystem *mesgsys, void **user_data, U32 block_num, const EObjectUpdateType update_type, LLDataPacker *dp) { - U32 retval = LLVOAvatar::processUpdateMessage(mesgsys,user_data,block_num,update_type,dp); - -#if 0 - // DRANO - it's not clear this does anything useful. If we wait - // until an appearance message has been received, we already have - // the texture ids. If we don't wait, we don't yet know where to - // look for baked textures, because we haven't received the - // appearance version data from the appearance message. This looks - // like an old optimization that's incompatible with server-side - // texture baking. - - // FIXME DRANO - skipping in the case of !mFirstAppearanceMessageReceived prevents us from trying to - // load textures before we know where they come from (ie, from baking service or not); - // unknown impact on performance. - if (mInitialBakesLoaded == false && retval == 0x0 && mFirstAppearanceMessageReceived) - { - // call update textures to force the images to be created - updateMeshTextures(); - - // unpack the texture UUIDs to the texture slots - retval = unpackTEMessage(mesgsys, _PREHASH_ObjectData, (S32) block_num); - - // need to trigger a few operations to get the avatar to use the new bakes - for (U32 i = 0; i < mBakedTextureDatas.size(); i++) - { - const LLAvatarAppearanceDefines::ETextureIndex te = mBakedTextureDatas[i].mTextureIndex; - LLUUID texture_id = getTEImage(te)->getID(); - setNewBakedTexture(te, texture_id); - mInitialBakeIDs[i] = texture_id; - } - - onFirstTEMessageReceived(); - - mInitialBakesLoaded = true; - } -#endif - - return retval; + return LLVOAvatar::processUpdateMessage(mesgsys, user_data, block_num, update_type, dp); } void LLVOAvatarSelf::setLocalTextureTE(U8 te, LLViewerTexture* image, U32 index) @@ -824,7 +784,7 @@ void LLVOAvatarSelf::removeMissingBakedTextures() if (!tex || tex->isMissingAsset()) { LLViewerTexture *imagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR); - if (imagep) + if (imagep && imagep != tex) { setTEImage(te, imagep); removed = TRUE; @@ -863,9 +823,9 @@ void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp) // Diagnostic info //LLVector3d pos_from_new_region = getPositionGlobal(); - //llinfos << "pos_from_old_region is " << global_pos_from_old_region + //LL_INFOS() << "pos_from_old_region is " << global_pos_from_old_region // << " while pos_from_new_region is " << pos_from_new_region - // << llendl; + // << LL_ENDL; } if (!regionp || (regionp->getHandle() != mLastRegionHandle)) @@ -971,7 +931,6 @@ void LLVOAvatarSelf::idleUpdateTractorBeam() mBeam->setPositionGlobal(pick.mPosGlobal); } - } if (mBeamTimer.getElapsedTimeF32() > 0.25f) { @@ -988,7 +947,7 @@ void LLVOAvatarSelf::idleUpdateTractorBeam() // virtual void LLVOAvatarSelf::restoreMeshData() { - //llinfos << "Restoring" << llendl; + //LL_INFOS() << "Restoring" << LL_ENDL; mMeshValid = TRUE; updateJointLODs(); updateAttachmentVisibility(gAgentCamera.getCameraMode()); @@ -1069,13 +1028,13 @@ void LLVOAvatarSelf::wearableUpdated( LLWearableType::EType type, BOOL upload_re } } } - + // Physics type has no associated baked textures, but change of params needs to be sent to // other avatars. if (type == LLWearableType::WT_PHYSICS) - { - gAgent.sendAgentSetAppearance(); - } + { + gAgent.sendAgentSetAppearance(); + } } //----------------------------------------------------------------------------- @@ -1492,7 +1451,7 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLViewerTexLayerSet* laye //----------------------------------------------------------------------------- BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLViewerTexLayerSet* layerset) const { - const U32 desired_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel"); + static LLCachedControl desired_tex_discard_level(gSavedSettings, "TextureDiscardLevel"); // const U32 desired_tex_discard_level = 0; // hack to not bake textures on lower discard levels. for (U32 i = 0; i < mBakedTextureDatas.size(); i++) @@ -1527,7 +1486,7 @@ BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLViewerTexLayerSet* layerset BOOL LLVOAvatarSelf::isAllLocalTextureDataFinal() const { - const U32 desired_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel"); + static LLCachedControl desired_tex_discard_level(gSavedSettings, "TextureDiscardLevel"); // const U32 desired_tex_discard_level = 0; // hack to not bake textures on lower discard levels for (U32 i = 0; i < mBakedTextureDatas.size(); i++) @@ -1669,7 +1628,7 @@ void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_r { return; } - // llinfos << "LLVOAvatar::invalidComposite() " << layerset->getBodyRegionName() << llendl; + // LL_INFOS() << "LLVOAvatar::invalidComposite() " << layerset->getBodyRegionName() << LL_ENDL; layer_set->requestUpdate(); layer_set->invalidateMorphMasks(); @@ -2101,7 +2060,10 @@ BOOL LLVOAvatarSelf::getIsCloud() const /*static*/ void LLVOAvatarSelf::debugOnTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata) { - gAgentAvatarp->debugTimingLocalTexLoaded(success, src_vi, src, aux_src, discard_level, final, userdata); + if (gAgentAvatarp.notNull()) + { + gAgentAvatarp->debugTimingLocalTexLoaded(success, src_vi, src, aux_src, discard_level, final, userdata); + } } void LLVOAvatarSelf::debugTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata) @@ -2214,7 +2176,7 @@ void LLVOAvatarSelf::dumpAllTextures() const if (!layerset_buffer) continue; vd_text += verboseDebugDumpLocalTextureDataInfo(layerset); } - LL_DEBUGS("Avatar") << vd_text << llendl; + LL_DEBUGS("Avatar") << vd_text << LL_ENDL; } const std::string LLVOAvatarSelf::debugDumpLocalTextureDataInfo(const LLViewerTexLayerSet* layerset) const @@ -2285,28 +2247,9 @@ const std::string LLVOAvatarSelf::debugDumpAllLocalTextureDataInfo() const return text; } - -#if 0 -// Dump avatar metrics data. -LLSD LLVOAvatarSelf::metricsData() -{ - // runway - add region info - LLSD result; - result["rez_status"] = LLVOAvatar::rezStatusToString(getRezzedStatus()); - result["timers"]["debug_existence"] = mDebugExistenceTimer.getElapsedTimeF32(); - result["timers"]["ruth_debug"] = mRuthDebugTimer.getElapsedTimeF32(); - result["timers"]["ruth"] = mRuthTimer.getElapsedTimeF32(); - result["timers"]["invisible"] = mInvisibleTimer.getElapsedTimeF32(); - result["timers"]["fully_loaded"] = mFullyLoadedTimer.getElapsedTimeF32(); - result["startup"] = LLStartUp::getPhases().dumpPhases(); - - return result; -} -#endif - -extern AIHTTPTimeoutPolicy appearanceChangeMetricsResponder_timeout; class ViewerAppearanceChangeMetricsResponder: public LLHTTPClient::ResponderWithResult { + LOG_CLASS(ViewerAppearanceChangeMetricsResponder); public: ViewerAppearanceChangeMetricsResponder( S32 expected_sequence, volatile const S32 & live_sequence, @@ -2317,7 +2260,8 @@ public: { } - /*virtual*/ void httpSuccess(void) +private: + /* virtual */ void httpSuccess() { LL_DEBUGS("Avatar") << "OK" << LL_ENDL; if (mLiveSequence == mExpectedSequence) @@ -2325,11 +2269,12 @@ public: mReportingStarted = true; } } - /*virtual*/ void httpFailure(void) + + /* virtual */ void httpFailure() { - LL_WARNS("Avatar") << "Failed " << mStatus << " reason " << mReason << LL_ENDL; + // if we add retry, this should be removed from the httpFailure case + LL_WARNS("Avatar") << dumpResponse() << LL_ENDL; } - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return appearanceChangeMetricsResponder_timeout; } /*virtual*/ char const* getName(void) const { return "AppearanceChangeMetricsResponder"; } private: S32 mExpectedSequence; @@ -2481,19 +2426,14 @@ void LLVOAvatarSelf::sendViewerAppearanceChangeMetrics() } } -extern AIHTTPTimeoutPolicy checkAgentAppearanceServiceResponder_timeout; class CheckAgentAppearanceServiceResponder: public LLHTTPClient::ResponderHeadersOnly { public: - CheckAgentAppearanceServiceResponder() - { - } - - virtual ~CheckAgentAppearanceServiceResponder() - { - } + CheckAgentAppearanceServiceResponder() {} - /*virtual*/ void completedHeaders(void) + virtual ~CheckAgentAppearanceServiceResponder() {} + + /*virtual*/ void completedHeaders() { if (isGoodStatus(mStatus)) { @@ -2509,16 +2449,6 @@ public: } } - // Error - /*virtual*//* void httpFailure(void) - { - if (isAgentAvatarValid()) - { - LL_DEBUGS("Avatar") << "failed, will rebake" << llendl; - forceAppearanceUpdate(); - } - } */ - static void forceAppearanceUpdate() { // Trying to rebake immediately after crossing region boundary @@ -2527,7 +2457,6 @@ public: doAfterInterval(force_bake_all_textures, 5.0); } - /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return checkAgentAppearanceServiceResponder_timeout; } /*virtual*/ char const* getName(void) const { return "CheckAgentAppearanceServiceResponder"; } }; diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 143ff6903..b44fd340e 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -1750,9 +1750,9 @@ ERlvCmdRet RlvHandler::onForceGroup(const RlvCommand& rlvCmd) const } else { - for (S32 idxGroup = 0, cntGroup = gAgent.mGroups.count(); (idxGroup < cntGroup) && (idGroup.isNull()); idxGroup++) - if (boost::iequals(gAgent.mGroups.get(idxGroup).mName, rlvCmd.getOption())) - idGroup = gAgent.mGroups.get(idxGroup).mID; + for (S32 idxGroup = 0, cntGroup = gAgent.mGroups.size(); (idxGroup < cntGroup) && (idGroup.isNull()); idxGroup++) + if (boost::iequals(gAgent.mGroups[idxGroup].mName, rlvCmd.getOption())) + idGroup = gAgent.mGroups[idxGroup].mID; fValid = (idGroup.notNull()) || ("none" == rlvCmd.getOption()); } diff --git a/indra/newview/rlvui.cpp b/indra/newview/rlvui.cpp index 46327d8c2..81c431453 100644 --- a/indra/newview/rlvui.cpp +++ b/indra/newview/rlvui.cpp @@ -488,12 +488,12 @@ bool RlvUIEnabler::canViewParcelProperties() const LLUUID& idOwner = pParcel->getOwnerID(); if ( (idOwner != gAgent.getID()) ) { - S32 count = gAgent.mGroups.count(); + S32 count = gAgent.mGroups.size(); for (S32 i = 0; i < count; ++i) { - if (gAgent.mGroups.get(i).mID == idOwner) + if (gAgent.mGroups[i].mID == idOwner) { - fShow = ((gAgent.mGroups.get(i).mPowers & GP_LAND_RETURN) > 0); + fShow = ((gAgent.mGroups[i].mPowers & GP_LAND_RETURN) > 0); break; } } diff --git a/indra/newview/skins/default/xui/en-us/strings.xml b/indra/newview/skins/default/xui/en-us/strings.xml index be50d389f..df9b9f732 100644 --- a/indra/newview/skins/default/xui/en-us/strings.xml +++ b/indra/newview/skins/default/xui/en-us/strings.xml @@ -3347,6 +3347,10 @@ The Allowed Residents: ([ALLOWEDAGENTS], max [MAXACCESS]) Allowed groups: ([ALLOWEDGROUPS], max [MAXACCESS]) + Estate Managers: ([ESTATEMANAGERS], max [MAXMANAGERS]) + Banned Residents: ([BANNEDAGENTS], max [MAXBANNED]) + Allowed Residents + Banned Residents Parcel Script Memory diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 82c26c99c..7aa74d66c 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -762,11 +762,7 @@ class LinuxManifest(ViewerManifest): else: installer_name += '_' + self.channel_oneword().upper() - if self.args['buildtype'].lower() in ['release', 'releasesse2']: - print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build" - # makes some small assumptions about our packaged dir structure - self.run_command("find %(d)r/bin %(d)r/lib* -type f | xargs -d '\n' --no-run-if-empty strip --strip-unneeded" % {'d': self.get_dst_prefix()} ) - self.run_command("find %(d)r/bin %(d)r/lib* -type f -not -name \\*.so | xargs -d '\n' --no-run-if-empty strip -s" % {'d': self.get_dst_prefix()} ) + self.strip_binaries() # Fix access permissions self.run_command(""" @@ -797,6 +793,12 @@ class LinuxManifest(ViewerManifest): 'dst': self.get_dst_prefix(), 'inst': self.build_path_of(installer_name)}) + def strip_binaries(self): + if self.args['buildtype'].lower() in ['release', 'releasesse2']: + print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build" + # makes some small assumptions about our packaged dir structure + self.run_command("find %(d)r/bin %(d)r/lib* -type f | xargs -d '\n' --no-run-if-empty strip --strip-unneeded" % {'d': self.get_dst_prefix()} ) + self.run_command("find %(d)r/bin %(d)r/lib* -type f -not -name \\*.so | xargs -d '\n' --no-run-if-empty strip -s" % {'d': self.get_dst_prefix()} ) class Linux_i686Manifest(LinuxManifest): def construct(self): From ab7acd71491e7bd3c805b4aec456e7732125b443 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Thu, 4 Sep 2014 17:30:10 -0400 Subject: [PATCH 21/34] Modernize LLSingleton --- indra/llcommon/llsingleton.cpp | 1 - indra/llcommon/llsingleton.h | 169 ++++++++++++++------------------- 2 files changed, 70 insertions(+), 100 deletions(-) diff --git a/indra/llcommon/llsingleton.cpp b/indra/llcommon/llsingleton.cpp index eb8e2c945..9b49e5237 100644 --- a/indra/llcommon/llsingleton.cpp +++ b/indra/llcommon/llsingleton.cpp @@ -28,5 +28,4 @@ #include "llsingleton.h" -std::map * LLSingletonRegistry::sSingletonMap = NULL; diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h index a780a6a24..0fad5a1fa 100644 --- a/indra/llcommon/llsingleton.h +++ b/indra/llcommon/llsingleton.h @@ -27,42 +27,9 @@ #include "llerror.h" // *TODO: eliminate this -#include #include #include -/// @brief A global registry of all singletons to prevent duplicate allocations -/// across shared library boundaries -class LL_COMMON_API LLSingletonRegistry { - private: - typedef std::map TypeMap; - static TypeMap * sSingletonMap; - - static void checkInit() - { - if(sSingletonMap == NULL) - { - sSingletonMap = new TypeMap(); - } - } - - public: - template static void * & get() - { - std::string name(typeid(T).name()); - - checkInit(); - - // the first entry of the pair returned by insert will be either the existing - // iterator matching our key, or the newly inserted NULL initialized entry - // see "Insert element" in http://www.sgi.com/tech/stl/UniqueAssociativeContainer.html - TypeMap::iterator result = - sSingletonMap->insert(std::make_pair(name, (void*)NULL)).first; - - return result->second; - } -}; - // LLSingleton implements the getInstance() method part of the Singleton // pattern. It can't make the derived class constructors protected, though, so // you have to do that yourself. @@ -101,21 +68,29 @@ private: DELETED } EInitState; - // stores pointer to singleton instance - // and tracks initialization state of singleton - struct SingletonInstanceData + static DERIVED_TYPE* constructSingleton() { - EInitState mInitState; - DERIVED_TYPE* mSingletonInstance; - - SingletonInstanceData() - : mSingletonInstance(NULL), - mInitState(UNINITIALIZED) - {} + return new DERIVED_TYPE(); + } - ~SingletonInstanceData() + // stores pointer to singleton instance + struct SingletonLifetimeManager + { + SingletonLifetimeManager() { - if (mInitState != DELETED) + construct(); + } + + static void construct() + { + sData.mInitState = CONSTRUCTING; + sData.mInstance = constructSingleton(); + sData.mInitState = INITIALIZING; + } + + ~SingletonLifetimeManager() + { + if (sData.mInitState != DELETED) { deleteSingleton(); } @@ -125,9 +100,8 @@ private: public: virtual ~LLSingleton() { - SingletonInstanceData& data = getData(); - data.mSingletonInstance = NULL; - data.mInitState = DELETED; + sData.mInstance = NULL; + sData.mInitState = DELETED; } /** @@ -152,37 +126,49 @@ public: */ static void deleteSingleton() { - DERIVED_TYPE* instance = getData().mSingletonInstance; - getData().mInitState = DELETED; - getData().mSingletonInstance = NULL; - delete instance; + delete sData.mInstance; + sData.mInstance = NULL; + sData.mInitState = DELETED; } - static SingletonInstanceData& getData() - { - // this is static to cache the lookup results - static void * & registry = LLSingletonRegistry::get(); - - // *TODO - look into making this threadsafe - if(NULL == registry) - { - static SingletonInstanceData data; - registry = &data; - } - - return *static_cast(registry); - } static DERIVED_TYPE* getInstance() { - SingletonInstanceData& data = getData(); + static SingletonLifetimeManager sLifeTimeMgr; - if (data.mInitState != INITIALIZED) + switch (sData.mInitState) { - createInstance(data); + case UNINITIALIZED: + // should never be uninitialized at this point + llassert(false); + return NULL; + case CONSTRUCTING: + llerrs << "Tried to access singleton " << typeid(DERIVED_TYPE).name() << " from singleton constructor!" << LL_ENDL; + return NULL; + case INITIALIZING: + // go ahead and flag ourselves as initialized so we can be reentrant during initialization + sData.mInitState = INITIALIZED; + // initialize singleton after constructing it so that it can reference other singletons which in turn depend on it, + // thus breaking cyclic dependencies + sData.mInstance->initSingleton(); + return sData.mInstance; + case INITIALIZED: + return sData.mInstance; + case DELETED: + llwarns << "Trying to access deleted singleton " << typeid(DERIVED_TYPE).name() << " creating new instance" << LL_ENDL; + SingletonLifetimeManager::construct(); + // same as first time construction + sData.mInitState = INITIALIZED; + sData.mInstance->initSingleton(); + return sData.mInstance; } - return data.mSingletonInstance; + return NULL; + } + + static DERIVED_TYPE* getIfExists() + { + return sData.mInstance; } // Reference version of getInstance() @@ -196,46 +182,31 @@ public: // Use this to avoid accessing singletons before the can safely be constructed static bool instanceExists() { - return getData().mInitState == INITIALIZED; + return sData.mInitState == INITIALIZED; } // Has this singleton already been deleted? // Use this to avoid accessing singletons from a static object's destructor static bool destroyed() { - return getData().mInitState == DELETED; + return sData.mInitState == DELETED; } private: - static void createInstance(SingletonInstanceData& data); + virtual void initSingleton() {} + + struct SingletonData + { + // explicitly has a default constructor so that member variables are zero initialized in BSS + // and only changed by singleton logic, not constructor running during startup + EInitState mInitState; + DERIVED_TYPE* mInstance; + }; + static SingletonData sData; }; - -// Moved this here cause it's too big to be inlined --Aleric. -template -void LLSingleton::createInstance(SingletonInstanceData& data) -{ - if (data.mInitState == CONSTRUCTING) - { - llerrs << "Tried to access singleton " << typeid(DERIVED_TYPE).name() << " from singleton constructor!" << llendl; - } - - if (data.mInitState == DELETED) - { - llwarns << "Trying to access deleted singleton " << typeid(DERIVED_TYPE).name() << " creating new instance" << llendl; - } - if (data.mInitState == INITIALIZING) - { - llerrs << "Tried to access singleton " << typeid(DERIVED_TYPE).name() << " from initSingleton(), using half-initialized object" << llendl; - return; - } - - data.mInitState = CONSTRUCTING; - data.mSingletonInstance = new DERIVED_TYPE(); - data.mInitState = INITIALIZING; - data.mSingletonInstance->initSingleton(); - data.mInitState = INITIALIZED; -} +template +typename LLSingleton::SingletonData LLSingleton::sData; #endif From 2338e8a18697d7a01f706b872d3df18f62bd0dc1 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Thu, 4 Sep 2014 17:31:11 -0400 Subject: [PATCH 22/34] Fix Issue 1653: Using Search Box causes crash --- indra/newview/llfloaterdirectory.cpp | 10 ++++++++-- indra/newview/llfloaterdirectory.h | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/indra/newview/llfloaterdirectory.cpp b/indra/newview/llfloaterdirectory.cpp index ed01ff283..e6606de36 100644 --- a/indra/newview/llfloaterdirectory.cpp +++ b/indra/newview/llfloaterdirectory.cpp @@ -454,13 +454,13 @@ void LLFloaterDirectory::requestClassifieds() void LLFloaterDirectory::searchInAll(const std::string& search_text) { + start(); LLPanelDirFindAllInterface::search(sInstance->mFindAllPanel, search_text); performQueryOn2("classified_panel", search_text); performQueryOn2("events_panel", search_text); performQueryOn2("groups_panel", search_text); performQueryOn2("people_panel", search_text); performQueryOn2("places_panel", search_text); - sInstance->open(); } void LLFloaterDirectory::showFindAll(const std::string& search_text) @@ -582,7 +582,7 @@ void LLFloaterDirectory::focusCurrentPanel() } // static -void LLFloaterDirectory::showPanel(const std::string& tabname) +void LLFloaterDirectory::start() { // This function gets called when web browser clicks are processed, // so we don't delete the existing panel, which would delete the @@ -592,6 +592,12 @@ void LLFloaterDirectory::showPanel(const std::string& tabname) sInstance = new LLFloaterDirectory("directory"); } sInstance->open(); /*Flawfinder: ignore*/ +} + +// static +void LLFloaterDirectory::showPanel(const std::string& tabname) +{ + start(); sInstance->childShowTab("Directory Tabs", tabname); sInstance->focusCurrentPanel(); } diff --git a/indra/newview/llfloaterdirectory.h b/indra/newview/llfloaterdirectory.h index 0f5f1b501..c36ce412b 100644 --- a/indra/newview/llfloaterdirectory.h +++ b/indra/newview/llfloaterdirectory.h @@ -94,6 +94,7 @@ public: private: static void performQueryOn(const std::string& name, const std::string& search_text); static void performQueryOn2(const std::string& name, const std::string& search_text); + static void start(); static void showPanel(const std::string& tabname); /*virtual*/ void onClose(bool app_quitting); void focusCurrentPanel(); From 2772daa964cdbd2722ba1fe266fb93090ea8a2ba Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Thu, 4 Sep 2014 18:35:28 -0400 Subject: [PATCH 23/34] Preload trash icon Solves the issue where the remove saved login button has nothing on it --- indra/newview/skins/default/textures/textures.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index fb9c6c1e3..574f2b3a7 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -122,7 +122,7 @@ - + From f0f124a23a5e2a6eb1014b2726158b2d120973e0 Mon Sep 17 00:00:00 2001 From: Salvatore La Bua Date: Fri, 5 Sep 2014 15:40:09 +0200 Subject: [PATCH 24/34] Add skin Dark Green, based upon the Dark skin Little changes on fonts' and windows icons' colour. --- indra/newview/skins/DarkGreen.xml | 14 + indra/newview/skins/darkgreen/colors.xml | 207 ++++++++++ .../0098b015-3daf-4cfe-a72f-915369ea97c2.tga | Bin 0 -> 2870 bytes .../3c18c87e-5f50-14e2-e744-f44734aa365f.tga | Bin 0 -> 804 bytes .../5748decc-f629-461c-9a36-a35a221fe21f.tga | Bin 0 -> 3116 bytes .../7a0b1bdb-b5d9-4df5-bac2-ba230da93b5b.tga | Bin 0 -> 2694 bytes .../7dabc040-ec13-2309-ddf7-4f161f6de2f4.tga | Bin 0 -> 1068 bytes .../89e9fc7c-0b16-457d-be4f-136270759c4d.tga | Bin 0 -> 4140 bytes .../9cad3e6d-2d6d-107d-f8ab-5ba272b5bfe1.tga | Bin 0 -> 1068 bytes .../darkgreen/textures/active_speakers.tga | Bin 0 -> 1137 bytes .../darkgreen/textures/active_voice_tab.tga | Bin 0 -> 556 bytes .../skins/darkgreen/textures/arrow_down.tga | Bin 0 -> 1068 bytes .../skins/darkgreen/textures/arrow_up.tga | Bin 0 -> 418 bytes .../b4870163-6208-42a9-9801-93133bf9a6cd.tga | Bin 0 -> 2957 bytes .../skins/darkgreen/textures/black.tga | Bin 0 -> 3116 bytes .../skins/darkgreen/textures/btn_chatbar.tga | Bin 0 -> 820 bytes .../textures/btn_chatbar_selected.tga | Bin 0 -> 1900 bytes .../darkgreen/textures/button_anim_pause.tga | Bin 0 -> 940 bytes .../textures/button_anim_pause_selected.tga | Bin 0 -> 744 bytes .../darkgreen/textures/button_anim_play.tga | Bin 0 -> 937 bytes .../textures/button_anim_play_selected.tga | Bin 0 -> 761 bytes .../darkgreen/textures/button_anim_stop.tga | Bin 0 -> 864 bytes .../textures/button_anim_stop_selected.tga | Bin 0 -> 680 bytes .../textures/button_disabled_32x128.tga | Bin 0 -> 10284 bytes .../textures/button_enabled_32x128.tga | Bin 0 -> 7081 bytes .../button_enabled_selected_32x128.tga | Bin 0 -> 5468 bytes .../c1e21504-f136-451d-b8e9-929037812f1d.tga | Bin 0 -> 2949 bytes .../c63f124c-6340-4fbf-b59e-0869a44adb64.tga | Bin 0 -> 2713 bytes .../darkgreen/textures/cam_rotate_in.tga | Bin 0 -> 814 bytes .../darkgreen/textures/cam_rotate_out.tga | Bin 0 -> 5224 bytes .../darkgreen/textures/cam_tracking_in.tga | Bin 0 -> 946 bytes .../darkgreen/textures/cam_tracking_out.tga | Bin 0 -> 4816 bytes .../darkgreen/textures/cam_zoom_minus_in.tga | Bin 0 -> 1462 bytes .../skins/darkgreen/textures/cam_zoom_out.tga | Bin 0 -> 1434 bytes .../darkgreen/textures/cam_zoom_plus_in.tga | Bin 0 -> 1522 bytes .../ce15fd63-b0b6-463c-a37d-ea6393208b3e.tga | Bin 0 -> 2755 bytes .../textures/checkbox_disabled_false.tga | Bin 0 -> 1068 bytes .../textures/checkbox_disabled_true.tga | Bin 0 -> 1068 bytes .../textures/checkbox_enabled_false.tga | Bin 0 -> 657 bytes .../textures/checkbox_enabled_true.tga | Bin 0 -> 548 bytes .../skins/darkgreen/textures/circle.tga | Bin 0 -> 1068 bytes .../darkgreen/textures/close_in_blue.tga | Bin 0 -> 668 bytes .../darkgreen/textures/close_inactive.tga | Bin 0 -> 254 bytes .../textures/close_inactive_blue.tga | Bin 0 -> 254 bytes .../skins/darkgreen/textures/closebox.tga | Bin 0 -> 748 bytes .../darkgreen/textures/combobox_arrow.tga | Bin 0 -> 202 bytes .../skins/darkgreen/textures/darkgray.tga | Bin 0 -> 3116 bytes .../darkgreen/textures/eye_button_active.tga | Bin 0 -> 2552 bytes .../textures/eye_button_inactive.tga | Bin 0 -> 2889 bytes .../ff9a71eb-7414-4cf8-866e-a701deb7c3cf.tga | Bin 0 -> 804 bytes .../textures/ff_edit_mine_button.tga | Bin 0 -> 998 bytes .../textures/ff_edit_theirs_button.tga | Bin 0 -> 1081 bytes .../textures/ff_online_status_button.tga | Bin 0 -> 1076 bytes .../textures/ff_visible_map_button.tga | Bin 0 -> 853 bytes .../textures/ff_visible_online_button.tga | Bin 0 -> 1040 bytes .../darkgreen/textures/flyout_btn_left.tga | Bin 0 -> 504 bytes .../textures/flyout_btn_left_disabled.tga | Bin 0 -> 370 bytes .../textures/flyout_btn_left_selected.tga | Bin 0 -> 1561 bytes .../darkgreen/textures/flyout_btn_right.tga | Bin 0 -> 504 bytes .../textures/flyout_btn_right_disabled.tga | Bin 0 -> 370 bytes .../textures/flyout_btn_right_selected.tga | Bin 0 -> 1407 bytes .../skins/darkgreen/textures/folder_arrow.tga | Bin 0 -> 4140 bytes .../textures/icn_active-speakers-dot-lvl0.tga | Bin 0 -> 1068 bytes .../textures/icn_active-speakers-dot-lvl1.tga | Bin 0 -> 1068 bytes .../textures/icn_active-speakers-dot-lvl2.tga | Bin 0 -> 1068 bytes .../textures/icn_active-speakers-typing1.tga | Bin 0 -> 1068 bytes .../textures/icn_active-speakers-typing2.tga | Bin 0 -> 1068 bytes .../textures/icn_active-speakers-typing3.tga | Bin 0 -> 1068 bytes .../skins/darkgreen/textures/icn_chatbar.tga | Bin 0 -> 1075 bytes .../textures/icn_clear_lineeditor.tga | Bin 0 -> 1068 bytes .../textures/icn_media-pause_active.tga | Bin 0 -> 3168 bytes .../textures/icn_media-pause_disabled.tga | Bin 0 -> 2287 bytes .../textures/icn_media-pause_enabled.tga | Bin 0 -> 2705 bytes .../textures/icn_media-play_enabled.tga | Bin 0 -> 2540 bytes .../textures/icn_media-stop_enabled.tga | Bin 0 -> 2295 bytes .../skins/darkgreen/textures/icn_media.tga | Bin 0 -> 1811 bytes .../skins/darkgreen/textures/icn_music.tga | Bin 0 -> 2185 bytes .../darkgreen/textures/icn_scrollbar.tga | Bin 0 -> 1068 bytes .../darkgreen/textures/icn_scrollbar_bg.tga | Bin 0 -> 380 bytes .../textures/icn_scrollbar_thumb.tga | Bin 0 -> 490 bytes .../textures/icn_slide-groove_dark.tga | Bin 0 -> 170 bytes .../textures/icn_slide-highlight.tga | Bin 0 -> 261 bytes .../textures/icn_slide-thumb_dark.tga | Bin 0 -> 604 bytes .../textures/icn_speaker-muted_dark.tga | Bin 0 -> 710 bytes .../darkgreen/textures/icn_speaker_dark.tga | Bin 0 -> 752 bytes .../darkgreen/textures/icn_toolbar_build.tga | Bin 0 -> 949 bytes .../darkgreen/textures/icn_toolbar_fly.tga | Bin 0 -> 912 bytes .../textures/icn_toolbar_inventory.tga | Bin 0 -> 1209 bytes .../darkgreen/textures/icn_toolbar_map.tga | Bin 0 -> 904 bytes .../textures/icn_toolbar_minimap.tga | Bin 0 -> 1215 bytes .../darkgreen/textures/icn_toolbar_radar.tga | Bin 0 -> 2348 bytes .../darkgreen/textures/icn_toolbar_search.tga | Bin 0 -> 792 bytes .../textures/icn_toolbar_snapshot.tga | Bin 0 -> 988 bytes .../skins/darkgreen/textures/lightgray.tga | Bin 0 -> 3116 bytes .../skins/darkgreen/textures/minimize.tga | Bin 0 -> 476 bytes .../darkgreen/textures/minimize_inactive.tga | Bin 0 -> 194 bytes .../darkgreen/textures/minimize_pressed.tga | Bin 0 -> 380 bytes .../darkgreen/textures/move_backward_in.tga | Bin 0 -> 651 bytes .../darkgreen/textures/move_backward_out.tga | Bin 0 -> 769 bytes .../skins/darkgreen/textures/move_down_in.tga | Bin 0 -> 703 bytes .../darkgreen/textures/move_down_out.tga | Bin 0 -> 843 bytes .../darkgreen/textures/move_forward_in.tga | Bin 0 -> 693 bytes .../darkgreen/textures/move_forward_out.tga | Bin 0 -> 869 bytes .../skins/darkgreen/textures/move_left_in.tga | Bin 0 -> 580 bytes .../darkgreen/textures/move_left_out.tga | Bin 0 -> 660 bytes .../darkgreen/textures/move_right_in.tga | Bin 0 -> 598 bytes .../darkgreen/textures/move_right_out.tga | Bin 0 -> 674 bytes .../darkgreen/textures/move_turn_left_in.tga | Bin 0 -> 1032 bytes .../darkgreen/textures/move_turn_left_out.tga | Bin 0 -> 1166 bytes .../darkgreen/textures/move_turn_right_in.tga | Bin 0 -> 975 bytes .../textures/move_turn_right_out.tga | Bin 0 -> 1127 bytes .../skins/darkgreen/textures/move_up_in.tga | Bin 0 -> 703 bytes .../skins/darkgreen/textures/move_up_out.tga | Bin 0 -> 843 bytes .../skins/darkgreen/textures/mute_icon.tga | Bin 0 -> 1042 bytes .../skins/darkgreen/textures/notify_next.png | Bin 0 -> 3360 bytes .../skins/darkgreen/textures/preview.png | Bin 0 -> 21581 bytes .../darkgreen/textures/progress_fill.tga | Bin 0 -> 896 bytes .../darkgreen/textures/progressbar_fill.tga | Bin 0 -> 773 bytes .../darkgreen/textures/progressbar_track.tga | Bin 0 -> 486 bytes .../skins/darkgreen/textures/ptt_lock_off.tga | Bin 0 -> 670 bytes .../skins/darkgreen/textures/ptt_lock_on.tga | Bin 0 -> 1068 bytes .../darkgreen/textures/radio_active_false.tga | Bin 0 -> 683 bytes .../darkgreen/textures/radio_active_true.tga | Bin 0 -> 700 bytes .../textures/radio_inactive_false.tga | Bin 0 -> 1068 bytes .../textures/radio_inactive_true.tga | Bin 0 -> 1068 bytes .../resize_handle_bottom_right_blue.tga | Bin 0 -> 305 bytes .../skins/darkgreen/textures/restore.tga | Bin 0 -> 636 bytes .../darkgreen/textures/restore_inactive.tga | Bin 0 -> 194 bytes .../darkgreen/textures/restore_pressed.tga | Bin 0 -> 564 bytes .../darkgreen/textures/rounded_square.tga | Bin 0 -> 16428 bytes .../textures/rounded_square_soft.tga | Bin 0 -> 16428 bytes .../textures/scrollbutton_down_in_blue.tga | Bin 0 -> 672 bytes .../textures/scrollbutton_down_out_blue.tga | Bin 0 -> 919 bytes .../textures/scrollbutton_left_in_blue.tga | Bin 0 -> 745 bytes .../textures/scrollbutton_left_out_blue.tga | Bin 0 -> 951 bytes .../textures/scrollbutton_right_in_blue.tga | Bin 0 -> 751 bytes .../textures/scrollbutton_right_out_blue.tga | Bin 0 -> 956 bytes .../textures/scrollbutton_up_in_blue.tga | Bin 0 -> 694 bytes .../textures/scrollbutton_up_out_blue.tga | Bin 0 -> 929 bytes .../skins/darkgreen/textures/spacer24.tga | Bin 0 -> 2348 bytes .../skins/darkgreen/textures/spacer35.tga | Bin 0 -> 3404 bytes .../darkgreen/textures/spin_down_in_blue.tga | Bin 0 -> 340 bytes .../darkgreen/textures/spin_down_out_blue.tga | Bin 0 -> 365 bytes .../darkgreen/textures/spin_up_in_blue.tga | Bin 0 -> 336 bytes .../darkgreen/textures/spin_up_out_blue.tga | Bin 0 -> 387 bytes .../darkgreen/textures/square_btn_32x128.tga | Bin 0 -> 5488 bytes .../textures/square_btn_selected_32x128.tga | Bin 0 -> 4446 bytes .../textures/status_buy_currency.tga | Bin 0 -> 740 bytes .../textures/status_buy_currency_pressed.tga | Bin 0 -> 626 bytes .../darkgreen/textures/status_buy_land.tga | Bin 0 -> 762 bytes .../darkgreen/textures/tab_bottom_blue.tga | Bin 0 -> 653 bytes .../textures/tab_bottom_selected_blue.tga | Bin 0 -> 500 bytes .../skins/darkgreen/textures/tab_left.tga | Bin 0 -> 5826 bytes .../darkgreen/textures/tab_left_selected.tga | Bin 0 -> 5801 bytes .../skins/darkgreen/textures/tab_top_blue.tga | Bin 0 -> 654 bytes .../textures/tab_top_selected_blue.tga | Bin 0 -> 500 bytes .../skins/darkgreen/textures/tabarea.tga | Bin 0 -> 1340 bytes .../skins/darkgreen/textures/textures.xml | 389 ++++++++++++++++++ .../skins/darkgreen/textures/tool_dozer.tga | Bin 0 -> 3193 bytes .../darkgreen/textures/tool_dozer_active.tga | Bin 0 -> 3279 bytes .../skins/darkgreen/textures/tool_zoom.tga | Bin 0 -> 2626 bytes .../darkgreen/textures/tool_zoom_active.tga | Bin 0 -> 2869 bytes .../textures/toolbar_btn_disabled.tga | Bin 0 -> 12332 bytes .../textures/toolbar_btn_enabled.tga | Bin 0 -> 644 bytes .../textures/toolbar_btn_selected.tga | Bin 0 -> 2608 bytes .../skins/darkgreen/textures/toolbar_tab.tga | Bin 0 -> 18211 bytes .../skins/darkgreen/textures/white.tga | Bin 0 -> 3116 bytes 167 files changed, 610 insertions(+) create mode 100644 indra/newview/skins/DarkGreen.xml create mode 100644 indra/newview/skins/darkgreen/colors.xml create mode 100644 indra/newview/skins/darkgreen/textures/0098b015-3daf-4cfe-a72f-915369ea97c2.tga create mode 100644 indra/newview/skins/darkgreen/textures/3c18c87e-5f50-14e2-e744-f44734aa365f.tga create mode 100644 indra/newview/skins/darkgreen/textures/5748decc-f629-461c-9a36-a35a221fe21f.tga create mode 100644 indra/newview/skins/darkgreen/textures/7a0b1bdb-b5d9-4df5-bac2-ba230da93b5b.tga create mode 100644 indra/newview/skins/darkgreen/textures/7dabc040-ec13-2309-ddf7-4f161f6de2f4.tga create mode 100644 indra/newview/skins/darkgreen/textures/89e9fc7c-0b16-457d-be4f-136270759c4d.tga create mode 100644 indra/newview/skins/darkgreen/textures/9cad3e6d-2d6d-107d-f8ab-5ba272b5bfe1.tga create mode 100644 indra/newview/skins/darkgreen/textures/active_speakers.tga create mode 100644 indra/newview/skins/darkgreen/textures/active_voice_tab.tga create mode 100644 indra/newview/skins/darkgreen/textures/arrow_down.tga create mode 100644 indra/newview/skins/darkgreen/textures/arrow_up.tga create mode 100644 indra/newview/skins/darkgreen/textures/b4870163-6208-42a9-9801-93133bf9a6cd.tga create mode 100644 indra/newview/skins/darkgreen/textures/black.tga create mode 100644 indra/newview/skins/darkgreen/textures/btn_chatbar.tga create mode 100644 indra/newview/skins/darkgreen/textures/btn_chatbar_selected.tga create mode 100644 indra/newview/skins/darkgreen/textures/button_anim_pause.tga create mode 100644 indra/newview/skins/darkgreen/textures/button_anim_pause_selected.tga create mode 100644 indra/newview/skins/darkgreen/textures/button_anim_play.tga create mode 100644 indra/newview/skins/darkgreen/textures/button_anim_play_selected.tga create mode 100644 indra/newview/skins/darkgreen/textures/button_anim_stop.tga create mode 100644 indra/newview/skins/darkgreen/textures/button_anim_stop_selected.tga create mode 100644 indra/newview/skins/darkgreen/textures/button_disabled_32x128.tga create mode 100644 indra/newview/skins/darkgreen/textures/button_enabled_32x128.tga create mode 100644 indra/newview/skins/darkgreen/textures/button_enabled_selected_32x128.tga create mode 100644 indra/newview/skins/darkgreen/textures/c1e21504-f136-451d-b8e9-929037812f1d.tga create mode 100644 indra/newview/skins/darkgreen/textures/c63f124c-6340-4fbf-b59e-0869a44adb64.tga create mode 100644 indra/newview/skins/darkgreen/textures/cam_rotate_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/cam_rotate_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/cam_tracking_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/cam_tracking_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/cam_zoom_minus_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/cam_zoom_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/cam_zoom_plus_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/ce15fd63-b0b6-463c-a37d-ea6393208b3e.tga create mode 100644 indra/newview/skins/darkgreen/textures/checkbox_disabled_false.tga create mode 100644 indra/newview/skins/darkgreen/textures/checkbox_disabled_true.tga create mode 100644 indra/newview/skins/darkgreen/textures/checkbox_enabled_false.tga create mode 100644 indra/newview/skins/darkgreen/textures/checkbox_enabled_true.tga create mode 100644 indra/newview/skins/darkgreen/textures/circle.tga create mode 100644 indra/newview/skins/darkgreen/textures/close_in_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/close_inactive.tga create mode 100644 indra/newview/skins/darkgreen/textures/close_inactive_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/closebox.tga create mode 100644 indra/newview/skins/darkgreen/textures/combobox_arrow.tga create mode 100644 indra/newview/skins/darkgreen/textures/darkgray.tga create mode 100644 indra/newview/skins/darkgreen/textures/eye_button_active.tga create mode 100644 indra/newview/skins/darkgreen/textures/eye_button_inactive.tga create mode 100644 indra/newview/skins/darkgreen/textures/ff9a71eb-7414-4cf8-866e-a701deb7c3cf.tga create mode 100644 indra/newview/skins/darkgreen/textures/ff_edit_mine_button.tga create mode 100644 indra/newview/skins/darkgreen/textures/ff_edit_theirs_button.tga create mode 100644 indra/newview/skins/darkgreen/textures/ff_online_status_button.tga create mode 100644 indra/newview/skins/darkgreen/textures/ff_visible_map_button.tga create mode 100644 indra/newview/skins/darkgreen/textures/ff_visible_online_button.tga create mode 100644 indra/newview/skins/darkgreen/textures/flyout_btn_left.tga create mode 100644 indra/newview/skins/darkgreen/textures/flyout_btn_left_disabled.tga create mode 100644 indra/newview/skins/darkgreen/textures/flyout_btn_left_selected.tga create mode 100644 indra/newview/skins/darkgreen/textures/flyout_btn_right.tga create mode 100644 indra/newview/skins/darkgreen/textures/flyout_btn_right_disabled.tga create mode 100644 indra/newview/skins/darkgreen/textures/flyout_btn_right_selected.tga create mode 100644 indra/newview/skins/darkgreen/textures/folder_arrow.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_active-speakers-dot-lvl0.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_active-speakers-dot-lvl1.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_active-speakers-dot-lvl2.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_active-speakers-typing1.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_active-speakers-typing2.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_active-speakers-typing3.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_chatbar.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_clear_lineeditor.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_media-pause_active.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_media-pause_disabled.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_media-pause_enabled.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_media-play_enabled.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_media-stop_enabled.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_media.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_music.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_scrollbar.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_scrollbar_bg.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_scrollbar_thumb.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_slide-groove_dark.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_slide-highlight.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_slide-thumb_dark.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_speaker-muted_dark.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_speaker_dark.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_toolbar_build.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_toolbar_fly.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_toolbar_inventory.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_toolbar_map.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_toolbar_minimap.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_toolbar_radar.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_toolbar_search.tga create mode 100644 indra/newview/skins/darkgreen/textures/icn_toolbar_snapshot.tga create mode 100644 indra/newview/skins/darkgreen/textures/lightgray.tga create mode 100644 indra/newview/skins/darkgreen/textures/minimize.tga create mode 100644 indra/newview/skins/darkgreen/textures/minimize_inactive.tga create mode 100644 indra/newview/skins/darkgreen/textures/minimize_pressed.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_backward_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_backward_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_down_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_down_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_forward_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_forward_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_left_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_left_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_right_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_right_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_turn_left_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_turn_left_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_turn_right_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_turn_right_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_up_in.tga create mode 100644 indra/newview/skins/darkgreen/textures/move_up_out.tga create mode 100644 indra/newview/skins/darkgreen/textures/mute_icon.tga create mode 100644 indra/newview/skins/darkgreen/textures/notify_next.png create mode 100644 indra/newview/skins/darkgreen/textures/preview.png create mode 100644 indra/newview/skins/darkgreen/textures/progress_fill.tga create mode 100644 indra/newview/skins/darkgreen/textures/progressbar_fill.tga create mode 100644 indra/newview/skins/darkgreen/textures/progressbar_track.tga create mode 100644 indra/newview/skins/darkgreen/textures/ptt_lock_off.tga create mode 100644 indra/newview/skins/darkgreen/textures/ptt_lock_on.tga create mode 100644 indra/newview/skins/darkgreen/textures/radio_active_false.tga create mode 100644 indra/newview/skins/darkgreen/textures/radio_active_true.tga create mode 100644 indra/newview/skins/darkgreen/textures/radio_inactive_false.tga create mode 100644 indra/newview/skins/darkgreen/textures/radio_inactive_true.tga create mode 100644 indra/newview/skins/darkgreen/textures/resize_handle_bottom_right_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/restore.tga create mode 100644 indra/newview/skins/darkgreen/textures/restore_inactive.tga create mode 100644 indra/newview/skins/darkgreen/textures/restore_pressed.tga create mode 100644 indra/newview/skins/darkgreen/textures/rounded_square.tga create mode 100644 indra/newview/skins/darkgreen/textures/rounded_square_soft.tga create mode 100644 indra/newview/skins/darkgreen/textures/scrollbutton_down_in_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/scrollbutton_down_out_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/scrollbutton_left_in_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/scrollbutton_left_out_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/scrollbutton_right_in_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/scrollbutton_right_out_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/scrollbutton_up_in_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/scrollbutton_up_out_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/spacer24.tga create mode 100644 indra/newview/skins/darkgreen/textures/spacer35.tga create mode 100644 indra/newview/skins/darkgreen/textures/spin_down_in_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/spin_down_out_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/spin_up_in_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/spin_up_out_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/square_btn_32x128.tga create mode 100644 indra/newview/skins/darkgreen/textures/square_btn_selected_32x128.tga create mode 100644 indra/newview/skins/darkgreen/textures/status_buy_currency.tga create mode 100644 indra/newview/skins/darkgreen/textures/status_buy_currency_pressed.tga create mode 100644 indra/newview/skins/darkgreen/textures/status_buy_land.tga create mode 100644 indra/newview/skins/darkgreen/textures/tab_bottom_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/tab_bottom_selected_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/tab_left.tga create mode 100644 indra/newview/skins/darkgreen/textures/tab_left_selected.tga create mode 100644 indra/newview/skins/darkgreen/textures/tab_top_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/tab_top_selected_blue.tga create mode 100644 indra/newview/skins/darkgreen/textures/tabarea.tga create mode 100644 indra/newview/skins/darkgreen/textures/textures.xml create mode 100644 indra/newview/skins/darkgreen/textures/tool_dozer.tga create mode 100644 indra/newview/skins/darkgreen/textures/tool_dozer_active.tga create mode 100644 indra/newview/skins/darkgreen/textures/tool_zoom.tga create mode 100644 indra/newview/skins/darkgreen/textures/tool_zoom_active.tga create mode 100644 indra/newview/skins/darkgreen/textures/toolbar_btn_disabled.tga create mode 100644 indra/newview/skins/darkgreen/textures/toolbar_btn_enabled.tga create mode 100644 indra/newview/skins/darkgreen/textures/toolbar_btn_selected.tga create mode 100644 indra/newview/skins/darkgreen/textures/toolbar_tab.tga create mode 100644 indra/newview/skins/darkgreen/textures/white.tga diff --git a/indra/newview/skins/DarkGreen.xml b/indra/newview/skins/DarkGreen.xml new file mode 100644 index 000000000..4f32939ae --- /dev/null +++ b/indra/newview/skins/DarkGreen.xml @@ -0,0 +1,14 @@ + + + skin_name + Dark Green + author_name + JB Kraft, modified by SLB Wirefly + additional_author_names + Linden Lab + skin_info + + folder_name + darkgreen + + diff --git a/indra/newview/skins/darkgreen/colors.xml b/indra/newview/skins/darkgreen/colors.xml new file mode 100644 index 000000000..50dfe55d3 --- /dev/null +++ b/indra/newview/skins/darkgreen/colors.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/darkgreen/textures/0098b015-3daf-4cfe-a72f-915369ea97c2.tga b/indra/newview/skins/darkgreen/textures/0098b015-3daf-4cfe-a72f-915369ea97c2.tga new file mode 100644 index 0000000000000000000000000000000000000000..a563672f7bf909b31d5990a59eb2e45e9cbb1b37 GIT binary patch literal 2870 zcmZveSx;406vrd;Qn&Uu$odE68O=sLS{J z!us^-lPfkh_UD5K5B~LQa&od*e6hnnesOVeizz87(&Os-L;U#KyLa#JuEfMdvDvcH z($XY7JzX+0GsVuz$`U&}J6nD^di3b3fGZ&(K{lZn@zm5*sjRG&>gsAaefqSVJ$qKp zojWHrH8oOOTPvLn4Gj`>{``4qX=#y5mo7Z_`%6ynU8GY*6oj9@_8+uLPgVnP-c7UbQ#cly1wv?Sf#-D-$00FL@VWBI;) z`=q3#M9Rv_6sDr0LTqqc_~HdAxVgDmMn^|wetupK9Xcfb{{C|EfAfwzDWhpEyl;YxIIez@O0+p7Qeg@V-+%^+};o)JKo10S)fw+D9woFY;=}G)R zFg`whJ&Z4_lAD_=`T6-$P*9+dMMXuQ!M1_>6f(?;;{1gfak}x**~9;lqc;2Hs6g1mdUH>y?KOA8N=T08m@DY+1$hhvu(ezm^*} zZb(i}j@X>DA|oRmK!4*Mv4=fw_-O;}2J=g5ijZ8sd|4hpek?CvzI3PoP-tkVgoTAk zYip~#di6@HiZgDkw$N%a_k)4jv15lqB_$=PU+m)=7819ip&^~IzOS!Oo;`b}u#~j% z&%oNYt^ZNXAhuw>wR7iA2R6XKvU%df2^km|5c~S|>tglx_DWArk4#Tbi#;Q??Ual~&6+R<8z}k&6+_pi7cdaq zzJ0r9lQmh@A`3LMpw94}nB2Q}Ps_xIu?A$b0m06&^Oua;~e-kUCoZLNn^hlbTnzWabCvpj;J=}v9cZC6P=nM%_ z-i|^)nkuUnRu*3{YjAK-JlC#W6N_ucsBmoLlA=x_7`19_Y(vQgu0VE)JyN8vzrSBR zcy5vUbqa6Zys7b7Sy|DmVB5BB8r4=51`=O(NGK9Sl8ad#rSvWCA*1wLlPW_Uj)3}K zE)Y=$v*8B+BZoX}AhzCHw{D4r)H?MPI*%v%5T=L@mt z&!21K@{Wv*h{YSssQ&jQ8N@c-8@jvQZoRKy0Y9@ literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/3c18c87e-5f50-14e2-e744-f44734aa365f.tga b/indra/newview/skins/darkgreen/textures/3c18c87e-5f50-14e2-e744-f44734aa365f.tga new file mode 100644 index 0000000000000000000000000000000000000000..f7841968a9f479689c58da177554298f1be651b8 GIT binary patch literal 804 zcmZ{jL283Q6ow}a38kwXp=94)p{o>y(n4)T5nW{?h@gq!R@;b)is#BDLKlS`s(q46-%I*tc@!GvZ%_v%PosV$d)|= eKMcoFHTV%keg$u@?sRMy%1%QDJsnUELqi zd3kw%4Gj&+`ue&oEG)?K^0KV0t;x#Difn9b$mZszUbnWkMMj*<_$oMBZB_&0t z%+AjK&*f87Qvz6WaGs<1#llrx1&ai>d%cwu;}7VKIx@tcvDmdwW|(Mn(j7 zme~+2vjYJpz>5!)lams(O@iJ^b#=7{VHiFM(A z+n-?+NPI)V&OyNd%MI=r2o2`>Ac>rrnUTJ}z7RIj=eUHtEZ>uEk15B z%yM{cATlsH!1qGuA}qXS0{RVx8`L{-hxIp1w73Hib2Jr@-_g+_-QC>+H#9JCg#<(| zFCvDAhm~V&Y)p!ai`Ao;n3xwXXL)(Kbai!!hq)GrAcr=BhqkshrO;sEa{z8&)m2gO z;S@Uo9znp6n3yPOX=%FA?d|O^dMw~%rpZXk3(=pm{oC|FouU;mDx zva&L?-pgzYM37-{^21UCxteKvXSn&q>tKse84yw-ln<)Iqk$fInD7~iR!d7uD5AGi zKQ=cvOR(igYiq0O5u1F_djA6l4=S1P%EXPJ>$%68S;wzEDgy%}>zK51B^t5-_mPLPjaD@w_`eKGq@) zry;`q{e3w&IM5FIMf(&v4KfTduW6|B#>Pga0JgTaR&&axW*4+tBJ3<9Haa>2P=5Q4 zAoeu@xq&T3MMVm3lh|>gpVCwk7pV=ft=|6*{3GDk*VnSNw4~cgj$jOxfO;+KNE=W}UMAFK-LySuy75NIbPBgvPQ zm8JT80Jus@N;G#!Ib`_x+$s=jLqHD?4?2uox<5b(2?^?=7oZ6Iqz_kBRjJn`7Fd1^ zv)Cjs0Q|(yO+Cl=`i7MKY(Fb4?u zdwYAeU$B_9=%c6e%r!19E(DH6Bp+vvK=4m2EPV&f{_X7SXmT5`bj2q-f<;~ zXkSR+9eWO7;QszzER1;v4KvEwb5aF0>?oeoc!1%G0egFUTK1GMWpi_LBLNJ43(Wxs z9*$3VhTAk9_-}7-^%*+U@hJxe6y~0to#~b503a4!fg27#u^hdCAx+o`@($a0CPtot zdkyoTFpOdaM=*=SUv_r3+WxG=Sir|T=-}`6(Qz_ZwckTW$L~R7CpkLWe}nx)EyL~s QcTe{(qrbX4Tk;(L0=pRs2><{9 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/7dabc040-ec13-2309-ddf7-4f161f6de2f4.tga b/indra/newview/skins/darkgreen/textures/7dabc040-ec13-2309-ddf7-4f161f6de2f4.tga new file mode 100644 index 0000000000000000000000000000000000000000..132b192ef10fb8eb9c9b1e5e030db0683b02caed GIT binary patch literal 1068 zcmb7^F-yZh6vq!Io$TV?S899Z=-?t` za`6L1KR|_kjOYCip1hnHOyJME``!E9ae+js8O2XURaABMd`&fVraDwIaNvHg218PV zNvXhri!&QTLOj`o#Fmeien`99($b_BLsBIoNJCK3h!KcUqL4s5;QEj-g}G#Vx+6StbOCz_k^y73}q2eIALjnhUWv#r(Zm@LTnE|-hx z&Ks=Vbt-;{N`o(SYSNCm}<3}$?@N<*f>2z{^bwxh z?N;>T@j;xcp}u^my@J)jVXQ37g8coB*%s;(wI6w^-KUsr&d+DEGe(UN*TvIvS!tMP zXaw<(;Md$F#_JmxM{dVvFfcvOOSMQoCs8?rp2v6{t$%?Rc-wl1aYTD2i&de^%ga;r z#d*oJ=^50Avp(E4D)XvPTcBX=b?kDVk7j41W5@lIkMm{G?9UdZjT`zE(nBC7*( leM;V6zb{kg^?#g~_-{aURgLF-#kq>gGdf>+h1a9!{s9mWmB#=8 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/9cad3e6d-2d6d-107d-f8ab-5ba272b5bfe1.tga b/indra/newview/skins/darkgreen/textures/9cad3e6d-2d6d-107d-f8ab-5ba272b5bfe1.tga new file mode 100644 index 0000000000000000000000000000000000000000..ceaaabab83e2a873f8e35321e6e5c838e4b3321c GIT binary patch literal 1068 zcmb7^Jxjw-6oxNOI@!g&v!Ihj6f_k{X;3USRfIaaIp}0)<09fDl;R*{(@n9-(7~mU zsf#}#`U5KTXB_VvIO*xNf+@V*bDwjbd|YUhnp6BMsDdiaUv8+X&RBaB)w#!<#L7_qVC%S!qy%ak$4E4qWyJtu=bPDrL`r8Vu=srL4!?^!pdf)YIYj zKn)iD!A<|=tVjs^yq63;=BEGDTq1;hb3cpA_YWG2gz%iKnPHW4(tkW$AcSXS%?zuY zlYY{zQq;1@4M%BE%e~~7#kHpVhnk)*3%^Y9ZDoq#8kkA+>@PoPQqtP1W^uJ!)6n9Q3^zAgL!8qJwF8uN4b&#Dq_H6Sm4$34#0pn+=TQftn35tcap1e1JA83WlASSct3+HY#Kr zC5kLU8WB{mv+z*{3kwN?Wtz2EBq!&)#?cJ~cHqvPbI$iT=iU+GzSum6;-NUacR@tr z3tqxvv5;CSm1wWq?NX=HA*Y)S3It{0?@pSd={Q5hE}8 zcbIUhYwSS-5wcPyB~94wqspAQz}Gs*5TnYkIXsP0Oco5l#bPn(SFhL6>wH}SIvR}< z+O^y5aGCEAF%+ik^?I~eEM%iPkp_c-Bo+z<+2Rfnj*&=&CX)%}^LY?=95b1WB!@zw zt>Y)m^X@Bcsxf;G=j`aif~89<#Kt%qBA}k4S2~kU}m(>ONt_v9m(?D z>2&%unM_i<-Co*kw)bAIx4~lK47LVD$f61q&?+iwDwPsK|B^Sb?o?5f%Vx8=YBU;s zrv4lbhZK*;U*>YTU)T{Nk2-L`OUZqfJmp1@hBEfQ@%oB&0~(LVRH;y4`!Oda5{YLxee8&lzc~T*`~BawTCL&p`J@3l&t|h%n+cFd9k{Il zY|#e9cX#A(8eDRB*R59ThuLhNVFH{vhQB8H;2ik>{x=txd-J@poE*PZ Rtjgd)_7Paq;nPGBocc9v`) z!6IZ~c+9++_tuXPGojBy%*AqUnx>GrOH>m00gsoTIgKhw5_DY$*L4wwAuP*!&myPJ zK7BIB89K{~x~`GuIXuq;PY?vivP@NS>g>};|95^IN42-_dz59VvdnP?Id$HHzN!2$ z42a_xZQCk8_or#9_A^hNefp;IMNxpTZJTR9o}Zk$_DtlfD2mWD4Se5+<2ZVUs^rw! er%&d;-{0TgPyY?)<7IO-PR3!sx^0c!W-XrQFH3m< literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/arrow_down.tga b/indra/newview/skins/darkgreen/textures/arrow_down.tga new file mode 100644 index 0000000000000000000000000000000000000000..5b05df1c29832e0bb9f0884ea9a25ab78bd4a7bf GIT binary patch literal 1068 zcmZQzU}As)0R{mE1&$VH28L0LH4IvT;qn-WK{TmhRFxZM_?magpZ_2lsK1H?Gtw)3 zrCtip|L~7z>Hq&A8pH?cPbb0*pOOIOm$K7u{|4!WVGti`h7TSyG|T;DUTXL3{Rz{D zOoPOsW@zFtqrH66w6A$5|NpP(?fp{G+4i|1&g3=;CXy&%lf{0H+e&)?kNy6lrUVPNik*yrrC_xG*xt+lu3we#FB-HZRD{`c?S zy$KU0lun&G_3!%J++6uQF~gUn%*@QDyu3U$96EGJNjy!QIPp&}CnrY%Q+`1~feH%? zRa8`@V8)CY3W|%1RXcn3Y6u z8#iv$rcIl)dGlsfZr!?7{_IuV3rMix)b3_N?B&f3K@ouj<&b zW4d+gmKnWs=T0*)9wK{(D&jnvG-;BSELoyu%a$4C%9Se>!0F**C9J8(j~`b83j0(;-Rd$)q*PoC)G$B$xlR#sMP z!nhh#Qc|M1bLVRQ{P{+{aN)uq42WSt1mCx8*`mhAMzNw>w{Dg@d@M7U8p48(m;eO66I%!&TCrkxGbno6hJ%9dOPoF+D6$~CcSY5kz6(cDL z2t_KnBt|=S?63q;e5~l)xw9gXh$VrfUA%bFT!YEwKJ~ zaQjA0LeI!rOt^jfwz_obqWb!J5n!4Kl0gl~kP;(4Z{EDIcv8dQIRnC$F=WUPBfoR! zj&O_qL!j^uqXNZ$9`t2A{e0xe5tAA(=$u4BOy=o;G!IG)$zm+A#Ysop)&(A7tfM)w zkSZXQF_4=H+Yv(ACBHLg&ZtL^9_rJlkI9k_Ms|@P7y)cP$c`>7GA1c|R0`GQ%a>IS zW;0ck;@i7-uLZbg&z`ESt<{4E4@`t~V7hp$6-DR~dHM3?i{*-K6h3XQ*&_>P6lrzu z-dz*~Jqj;w-n?mTgniJK6BeJ^cb=rUz_p|?K%bL@AL02|zLF5arAwC*^FA7+3nPt+ z|3_igr_j{-p*zIDSiwXRZv?jTzv1XUE-(hyhQ>v*DPI5>sXohyL4N-HS(O}rKD%25 zffK<&nlPilwXB%ly?cih!#v+@rNOhelEU#pY6Xva9eg6jt!rY?ph1bKMyM0&g*DUz zKfE#$4mls+97)tAk{Wj;Eh_-sn57<1iTGnZvSnQeO>6f-anPX@IVgbc*RP+&mSa8y z^RV0^oy#tqAW_=SN62(X#r4QC#xpGB5XMqE3zPoyy zyWTH*>GS-p4=Bq1r;YMmBaTg{s@w@OJc7u)|G9~fr?O%x-G*8UL_2q8c YUSa<4nMK(J*?GAc#aY=onZJ4e03M00hX4Qo literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/black.tga b/indra/newview/skins/darkgreen/textures/black.tga new file mode 100644 index 0000000000000000000000000000000000000000..e368ea49674e79a5f96f788212bb73fec02fe947 GIT binary patch literal 3116 zcmZQzU}As)1qKBM2^eRT9u0xf5Eu=C(GVC7fzc2c4S~@R7!85Z5Ewxr5E2yX8s-`7 P>F=i-;pXY%s>c8Tf>8xV literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/btn_chatbar.tga b/indra/newview/skins/darkgreen/textures/btn_chatbar.tga new file mode 100644 index 0000000000000000000000000000000000000000..76008aef0ca13b437487c6f346150f98296fe1fa GIT binary patch literal 820 zcmaKr*{T{r6h*6=gyiN6@)&$iz9AqtAV!5u=0ODqR1^`M5FDW4I^qE8mw1yv)BkeG zi{G)+tBD4ENJAZV?Y+Uwqd1cPed-K}7dFezV5fiLouufhOaW)9F-xNP{l!uy!_^y{SE!Oyp-W8ClS^JD1DdxL2!{d=6+q z7dIOh+DWI=+HSY%^?LesWqg7AJfA|LphO~}{eG|Ydac1=pr4@~2hQgNq-L|Ja=EN{ zJRVkdAq@#XkStrgcZAJmqjtM3CQicB)9>(|OoGbe@mP--EKV|>ozuGAuK0$u^+28( zjYc{`Uz<5zzuylVOD2=x8!+%JnQZjt`BeX@w9Nr41;nL!y z)9L6DWZ^J4K{$~@;~qE80l}ak4{4nwk0b{KgM$2@i+=tqzI^(6|1I`8mP)?;{vr19 H{+;;)sTF&n literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/btn_chatbar_selected.tga b/indra/newview/skins/darkgreen/textures/btn_chatbar_selected.tga new file mode 100644 index 0000000000000000000000000000000000000000..1698e72c2c144b314b4c16613d86f72fa876f8a7 GIT binary patch literal 1900 zcmai#>1rcK6op&rnJ~$~5J&>^GcS;U-ynY`UphN z83y|W@)*I-aiXs#)$TzF5lGxFb=`C7oO^G1-dCRc{N%m$zJC?X$;t6D-&p4R^da*j zR-XP@@gf8j6&3pEt^B135i9I?GAx;;r6qm2va+Jp)m5#nt!aIIU7MSm+S=OE&d!c@ zcXze7x2J=H1DT_vBSlY6PIP*DsZz+hrYhP03Qv; z#>N5-!ZyGoju0uz!KWU0a(Hi?o;5W!s;jG0eSN(e8ynTs)Fj8@-|*4EAi&G83yuX! zTw;fhA3Qn0ZyaEGdAaC}%F0SrRaL3Fx>~ihwU$IfLqkBIwYAj>(9zLhMZkox2nHuS zm|PAG4ar9go*W>}Xdg^rVWHj>6&0zZq(o(9WeQW^{J?YmFnrhp1BVDsK;jY>K0ff2 z4VRafr`P%U`6?(V5U|C?#TL4>wDdFR@W~C>9^xC+_kd3$fe$u8HV|)rfs{8lH@3!j zEnGK-!ihN14AwXf9m%3))uVmhaf9Lya;y&nMoWc zahe|SDGvgN^1`9eRWQa815D)Z?#>QIYi|TY$!AFDksoEl5nilh3&6&HZ8 z10X6c4oLL={@zZ#AWejgWHDs%DBc9aEKM8vj5LBQ`Yb{Up%VNXeRz1V(~~X6HXQ9| zXumk)=soiwP&=T=U?3UZCrRWzK0bcBE)0V+$>e;`(8%7))xmT@q9kHk`gbe`FF!W} zV||*r_Xkn-3m?0FppQdiOBs7-dz<5o-?jkEMhjB zkpMz4nM{z+=jE{5?V{iB3y>fZ(WakZ#--C~N%A0I20F={$zln+=NH zQIdr_gFc?K3QEUIvh6orYqc6Q3Z$0HCDdbQkd7i!AS(YKn8V@tBM-TyXo_V}w!fj$ zU5-JyTt>B8MKl@(i?moQh(sbtBob0SZ8q-SKw_Bt9T#4x*=#~J8Vx88gU+3}coT!n zrBVsmZ1z#Lw3TXdyr~vjrdq8Qo@mj_@uD^)<3Lv`6;Kc6e1Baogph(0zuWEPJK#ob sHX9h+u{L7JK?pVedVOCXKiVrj_rK9@b-XyuHuF!*XV*9LkC!jnZ|7d!00000 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/button_anim_pause_selected.tga b/indra/newview/skins/darkgreen/textures/button_anim_pause_selected.tga new file mode 100644 index 0000000000000000000000000000000000000000..f75b97d6d2cac9162992a5d92cefa224793429dd GIT binary patch literal 744 zcmZva&1%9x6op3@(solHp)b&a4`C$|8!$;Nf^Pgphj^ltO zIde^&dHTqZ&BO&7jRsn+7C6`Ib<}D#$Y!&NOr=tRWm!t?bUMlv<2;k9C9Bmcgl*g5 z=2E6;hh+8+#GEJ=i=kC&nifGSVm1l6g+d|n zUn8X@t&%q{cvz`6)o!<=`h&p$Dtia=eIMd#mECSPf_V9o**nnTa6np0iC(XV(P$J_ zPcIe=ESF2{_j^cslIZSuJl^D68+oVGDf%$~j_SYQ8lAB17zOf$@^>)K*Cstvi96XU S+xbt;)QpeUuXjz)zlnc+&tMM# literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/button_anim_play.tga b/indra/newview/skins/darkgreen/textures/button_anim_play.tga new file mode 100644 index 0000000000000000000000000000000000000000..37e9c7ec1d9a325ccc6ae5380cdd8b861238a3cc GIT binary patch literal 937 zcmZ`&*@_xb6zoZyMCK*)3BmW|7xFYgF+|+rhKd`CJMO!7yYGq%_(}600Y9VCbq0qF zAr0O4o~7!ZTj#W*JSey4QF&B88}CdelUaYSOZ@{{S9(6_pWmHM2aCl5>-8Gj?H2p} z9;ed@$Kz2}+VnHdywz%jMxy~@Nr35eif*@ye!mY@RWTlqF&d39pU-8bO+VwzE0s!^ z&1NKk5KJZ$6pKX(rqgL;vsvWxdGvZcAs7q>vL~2%jFa@0fCimpb~qdo3w*&j)cDoS{hY<`0-@?d2 zZt|JUW{h~)eZ5|X)9HlI=L1iqfV>_XE=sD*P$TB zwu7t2jk?)vVBn7B5kn3_DDyY{eSZDRp6R*$iY|xy>6gW6vHkqw{cid3^i}x-Jw@F4 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/button_anim_play_selected.tga b/indra/newview/skins/darkgreen/textures/button_anim_play_selected.tga new file mode 100644 index 0000000000000000000000000000000000000000..21d1c6db9ad128caa0406911700c1b53af9899f3 GIT binary patch literal 761 zcmZvaO=<6{6l+;{~)??q2Nw&={<6c zT)}1JWnPOWkQwOi>U#ARJyj*dtvG!)VH5Y)7Q5ZvFxFvgY~bxc4~_5PaEP&(e8Dmr zjX;kuHb}Z|>h(HWtrm1$N4MKWuh&Dr-&ZH^^ix;Sin}9BHkZqxSS%u&%_5)AE4x~) zf+=gY8faH46_iRPrI8_fP7sgBkw_#E4u>%q43JKz5sSr;OeR%wCeCCsNTpIL?v#Lk zrCuOO3cueEdDZ#EWuZ_&BoaX=6hbr_Rkn(;{6_dw;RIYaQs0UjRu@fCnPl!gk2D2N%eeT48 zA=A)Rbx+-MZuP0#n)XGzKabj@_RVf{I2=yvy{)YQjBZ4}TEm}SuZPuYh3$5W{eF+* z@rd*JjMM2PGh^c1XWnMBL95jQxfH;BK1aXb$8b1=QVOPNVmh5-xm?Q3m^k;DSE*F6 zSS%<25tz+pD3{B!IT#Eu8jXZV5``EOCz*Nqd|rxB;DG}x5TtUUP=Md>M<5V@@_0OW zFbo4urxU4EO0sgf943>A)YnO8kj-XMDwU8(Bw${zSLj}^S5VUaOHU?~$Ye5zMx!t< zmkTteE5f$%c>G>F7K=&oU@!=ic8WGp(%+>s2!%qRkk99Xx!diab44^94vP^yG%xYh zrDn4UEfR_RJ9j)D7bEzYbnk;?dh_~`A0^w#;N{h7H8dIxq|<5e^W1JXTrL;rs$!ti z?7Qh?kok!No2Ap~K(*U#C|;nAD}i`kox0U(6~$ul?UZsE^oK1;CuqCscDt}MBFdIv zD^QG0Sg+TyUazI_XRGjy6iTp54~K)yV=k09$raB=4mC)jlRvHZ1TJZ0;UgNybu@v|kqS3IK@eaq;Wsj?)e2N3 znxH7%OePadr&G*kGx)xb#bSZwa;aCw)S1_`_TAA;Z>Q5iuh+w1Fu-Uu!gxG}=Xv0f zTp3emo*X^&=8^;I^*S1j25Pk$%H=X#*M+K9tH?Qyqa$Wpt(K+|JKvv z3sR|6VtXcy+O`cbP4k4(q^Mm$Nr_3O6g3p2Vuj?9u&w=$1@4j literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/button_enabled_32x128.tga b/indra/newview/skins/darkgreen/textures/button_enabled_32x128.tga new file mode 100644 index 0000000000000000000000000000000000000000..acfa33e7f5674aa5ec02cea220904a9af794c649 GIT binary patch literal 7081 zcmZYE*H;x;76$ODx)(v6RuoWz=a`;97sFtmYf4EGC*^sHm=vUFN=m9Qq^71w z3Mv(|O-)S|CoL^iOe&68T3VV!(q5#=ix)2>E$xN8z=h=yefbj8iFMdhA;#ckWTZ=aMuudhXGkmq!OO&vnVBgWnYdx_vT$T&X5ltVY*tp5M6zCG z2}9PaSMn};{wIK1qfY++zGIXOAvy7C(2Uer|r+ zOq5}8`I)o)&z&VP|HHq^mRBhK@DYCK9R2Y4xY;=p(=U*V56@4^ZW)~1Jbd^(Kjn$d z%gd95y!<@L%g;yUNj`dh&`o|pz9bajD9A66f`S6cN3j)`DJ?A#Q(9UoZt49gT81lLmzI`ESy`Es zqAY_`R$eBiyu6<r88}BXG*gEBvJL`V3q?h>eX+AH(sVBEEW(k^my?dB}OWK!8Rr zirwVnaPsr=rCmXa`)VI+xDrU?!ae*1C+qLhawrn~|$<>0Ws2}afNDk>_al2wVHRaRDt zQ(09hrV7W?s;VlfM6p*@RZCShdbQuH@AaCRYN=*b*GLVkrUrA3n3~!eacgn##?;o< zN>XiItuWM~v~xz))YR$|;gd-SA5UQ+fLOrd7WunV#Mg;#YUY(-EXLXt7ng|T?mVWK zE)mFxK@3*gGi!WAN%SAi9(Kp>#0fYd`OGLVgG6)3_nv(v8% z8IV=t>V#k@==qf7!VTRb3Wq=@Vj6}B_4MXGphGM}y-1zX)hSNj^Lt=eBruurRXEogQhK2^64a38RHx0tz_c!vU0mVDkTV~cf#=y+wNami5N( zjmV9Szdgr4_#FAm9bZPihV&z7Xi3FNm4sl>fyd(B;DtR%7^G5S#djf~4g7 zarIO*^uub=k&9T1tc&Q;Q3XM17;w~y_ZmkXyhAEB$z_QY z7$Rh8)Ph&&zc8S2)d$O>S}uWnDfoD;P@xRF64^Fj{XruJ;shgs4zH`QXh{#gd&mYf>DHtLBY^XcXyX~UEST%-P0xA z=(fA3TcX`PJ<@~F{Q;eY*?d57IBCN1K@vaoevn=i`-k3M&Ase>tUfUePG5hY*glM! zOg~1KkB84Hkp~C$fttQv!7HYFMInz%#1LPrNV@{HDGt#rl?+$R^>+#rbskg2U!#EP z9$9CwT4d_PcE$I~>+Hl%>0Wh-WiVZ^!qF{G94djy$GU@x6S+)Ov$XQ=ta`-~>2DMY zrTPFxCo*a8@Bh6I^h-Yqdj0ZnK&Js27#P4U`XKWl`k)LlqYn%Xh#4Fj#DU2jLgHkH zhK4W=56RH*uown!7-?u^SlI0d!h?~~5g8d7kzsb!C@OqpUiiqUWw>P#_0#3@-$uo9 zh=mp7Lcvbg3`38a;V0ZM%hihZ^nCF53{HxMbJ`iyRVdI-oDKa=bC=A1>xRy($VIUcXhfE~%JH()-dZVLI z8;$E34w2EZF&P`ieYd+avI0<5r;dDgTaiCkBh^}j8BYNbibfxsrHnwVjqOq`v-y?>=w~z7VeloW3RAp z;f|@5Lq{{jC8J+_$sFz$kn|W9hZ|S{oQF&dM4}NpXXeRC+)Yl(B(nL0!TmJF+etB#Q+iB^nL>(9 zO;3q4jl)b&Ps`)!nQ38|o|%yuW~~{So}I=#BeQyspUuw7?Cgw~*|}NqW--n227{TK zo4b2n(eQcQt(Lx;BNFvrM=n;lT%)2&52@rYSkSpdzk!X3qEYE#xKz~Q#rOn@JuWw) zg1Ti&=W@A7rMngLeW(Q}LnN0-cUo#RHAON&xzu7%u>=ZH#_xC8@Y2q}D3MSzpqZTm zV8Aq|Gw2T3knWC4N0{NjSx1srA(M|5#%Q5F{$ zWr01&b_u~*T3V9W((;nH%Q%)-mc%TtEQ?ve5r3cb@5Ow%6y^b8xIZM(z2Y7Pv&uXO zW&92ZuxKU-hbU>LutMyl;yM}XST5BAZWU=LqkYETB+iCww_~5^iuysl`P|kSe;gj0r_9LQ%{FV#_KPqgZ5lWd+l+ ztgNDt&C2SEL{@REtgg!H+KMp8R@YW>`*~H?SQu76uSskTN8)E344*%Lmd{^UU;MuQ zMZRE;eL;Az{uL9#I&Z(O%Q`Cjg)jb_6&DC^UGVDRZ3|vGk9!l^V0VHAQXzMKks4Sh zl05JwD1yBSRUkwil`#|v5?lbaEK67*b}rH~x}}Im8j>u7CPo%lNx))g;;tf*!Vu>n zVOH0CiZ%2*mOGv`a9A4IFF-Q%h$zUq5Ap@wP$u#m^R3J)$jZK(nM~0E*rAkEk{kK>U@iS!T;cnyDf{9KJbpW$1-VP3i z?OojLfXeRd?nrbO$IkAq?Cu2}+3xP`N@RC$54XFrw~vl849?!czS#YJ9!TB+j)TK} z**`oGbATh^5C_A-w?p(pIYd81Hw@n4w{P*sbN34xm0V&FCB}dSSr>=vVrha^A%VXl zA&p^hH#Ro`wIM&bA<-?}7ns0>HZ)QRZ)=AxC>X>D@i-Kr169}wqdnl*0RRzp!D1Mq zdz|*cqJ0lM03(gN2bKMUJzpkDnf(J=PzW8_GDN5m*9m2!hewC<4Rv_*4drL^4FirN zagLadkRBWzAIUN5=sW8e`8eLqF)oshzkiqStP}h+=-*E;pR!JHeG-C&-GC%st@^w}k6L3e5q>{ymnvl{vtw zpuVvOD-%%=E)iCTJ7kFx`vw7r6owWq(-9yr9gC%cImWmD$*=A5`|^96699Pp;wPu4 zDBPSPIHzYPfx;OmPS4Kp{{ha=#5p^M4wE^%z<7RsF82K5T)Yb$7nkR9esLkOi^~g% zTwGn?=0YynQRedM636wWxR+N~xW1Iw)%BG`uWqj78sYl-I{qT)pS<|4@YkyF%iH+- z!tcv3uU|ZYi@+NKa5K0Q%!UMyxD*7TfMzZTR)841<60bZ6)+p(L{D@vK%z+B!SY=! zZM;()+zlG(l6cAklrs?hB#cXwa|CsXoU4iNaseAd66fL)6in_V4(i0{;Sk1LAz8}U zYsk3QH`hvI7~GrNYq>!%49?BX4bzQ8Z-3kf!wvfFk6XFDy%o#g-2VMm{`uqYKbU^V yFD8$wdWFCCRnRK27(|3{DPy9IKw|8yxAaasCH-@H)8w literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/button_enabled_selected_32x128.tga b/indra/newview/skins/darkgreen/textures/button_enabled_selected_32x128.tga new file mode 100644 index 0000000000000000000000000000000000000000..3823bc19436e144ec47037555ac901a4a05069ce GIT binary patch literal 5468 zcmaKw%TJxx6~)i@UBGsf+JM2l-^O4twt3nZY-2EB%*)1r!8UL6e!riNa=x3Wl{)C8 zlcrN5Po) zOzh8xCe0L{H5-k_{D)_7&N?@_Hixgx%%?DN?ku8 zjlRNHi!6SDPlA{DT3_PJ=|ne)YG>EJ#KnsjS*b`(4b`Tmrs7;`Y6?$unu3%RX)02j zPeF1D&ysbX44a&sj7T!40&B{hrb{1?FO(ZKT6IoeVtW0FGg3QcJ z*bFw4nUR4YgYEr{j7yNYM7?y0dWlM(PEEg*9?n$x^mJBQI&4~c8qTC~N=r*)U5u;# zL1`D$aFJ(LgLhF6$>)md%{=#ze6S#e&8G0RlJsPHF%6;r*30od^>XJ~dN)1bZ}fJa z9z~Cnq?U5l3JMAlEhs2}Uyz@Vd{sd{tc;hRmxsLkJVf(oyxiP82Wt z8HYoD0Ro3Z9+}9?%MWodc`+0`eQsoCsA~kHaENM+`4Qx$K4NOf< zb?Ch6>S|PLlHqg{H(9~Wn>Ueg^X3iQxN#FVoYGV6jT<-MUuToKas4`i>ujd#dKH4I zsw$kn#^!htCGsq>6C-@ z0FpY0yea}CaO^d1oN-|>vjukORxbXI!3s3K_Fx-Da%YXc5*pAK)oatoi=;%Ou zM?1BhsyU_|u)6Tu+uQNb)k6diA3lWF#`f@G8*H0vZEZ+wWov6|MJubVwGFMUt$4t) zt*sB>KVW+bHxW0rl~{TNAd zGLIj#y1PQ{dWg-D3p~7fmy9YR0=)zOIx=Jf7O0{uOp)o~kr5<5r+fbVIfkDPzg6Ap zAQ&DVM#2!=(C`o|)IoYXI5dRl;Lsq>4h|0D+2Aw8^x3m#c=l|7X9F0JvH}@zVBjeR z1_ls)N@JfqeG2dClc#v{2!MPPZ{DW z>Lg!mZYf!Zk+x8x)=_(Vhg&|{L?Y_@Z{7 zarfc{$5Eb{QMzFC#VGvI(NT=hNQ05l5qKg>K#?k;MWQ0Zr&tY-glIXWelSF?hDngn z8YV6vM~H#I$tshKHEO;2H(NRZ!VigVxXgj?Jwt*v+j?w#`jMquB%U&s2!8fzVE^6P7`Yi#~1+uHgnODAiqu&Zp|>gpc&fz^}ge1V_h5tYcUid&p)E zkK~RH;T;|xLdG5(9w6b6P3GWm9|s4a+WmulB<%0+V}E}Sdj~8j=RhX1x3`B~*52MO zbr*JbcNb=dExNP21AlvG2ir8;yW5Cv?`$J!dwUBqTT+&EQ%Z~iL6f>kU}E$*)l7cG zkPr%00BH{4S#uimLTC*_$w8GUa#q)PB0VK(h2E~Ltsp@Zt*o%9%TiV#sv@FFJS|b> z9bEp>(h_$QPX(FKN?2S9x76E>wSYi~`3r&+2fOAM2^^wPmXY`yy*k| z-QMA`0zN`iDf@>egxATRU783f#D~x3)LK$hjjnVU%&8aQ%(Vb(iu6Q*{d?qQ}sq y=yCK??w6eA<4=E%uY11y7n}>vzWobQey#g6I55;c-1V%hzprYfqpPR=y7@145i)B4 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/c1e21504-f136-451d-b8e9-929037812f1d.tga b/indra/newview/skins/darkgreen/textures/c1e21504-f136-451d-b8e9-929037812f1d.tga new file mode 100644 index 0000000000000000000000000000000000000000..6430fce1813e0ad9695308634f4bc2f349c4fd0c GIT binary patch literal 2949 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 AVE_OC literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/cam_rotate_out.tga b/indra/newview/skins/darkgreen/textures/cam_rotate_out.tga new file mode 100644 index 0000000000000000000000000000000000000000..f8f64f1df258eac9e8bb1fa0b2a4d2e74d875323 GIT binary patch literal 5224 zcmdUzyH8w46vlV%?gB}XbV-{gO68=8#5-bnvl3w5@3%1Tnl8n%UORpywh=^Fq~~8i zNY;i1(Lv-imQq0#5h{WxaG2cRH+xx-EX%TY6+*EZ&iTIYoS8Xu=H43$eH;q@Vxd^* zi=wo(HuR>S=Qtt<2M3?;?d^TFy}kYI`uh6t>gwuL!vDDwVT1(_2$16Z46$%$XXl&c z<>lGM#l`iRnVFYUQ&Z;?6BD+-zu)%u_S!^WU!N^xgar=>kT77PAgvVy3)a@wCKeVJ zUQA9-{t2zQx!J~IF#+u`A1o2aX+vxX5C`68e|!-9>9^qwHjTbu3b>aq#_#|Vpj z9w^YT#QzbI@bU5SC%*Qtot>SwtgI{puBoZ9V`F2=Q(_*uV8J87Flbn?QIXzbWwyV+ z|K;rL>~F+;NG=|eg3bmcWnqK`kHdh51zS3gF2(#Z_yfWtO^hmG7q$F`5f=G8P@oYJ z|Di;Vj*dR{>*)7Ok#Ia7w*vzMwzRZV(^OVrrild)h^#1VRHXMnqNk^)h4b_C+axYv zw6d~NlNuczwId@Vwzjr5yM|H3vETv0^kKLlsGx?b^z~!dFP8Z+Q;)J*4Gj$zFg4fR z-7QINQWSA4ctC)JA+A9MHR=AK8EkEBmHWr+Z}#%3)^>1k&^9$SWlD$<7Wq6-pkaxB z|LQWNiRgf=AhgEDMknMk!h*+PGSf{nUFqn@aCoTqXDX7n3khRD!xI0VGP=09Fn%Sy z;_$q)kOvwTZ0YF7&>yI;Wo5)+r#S(3Cxa0dJi-{zu*6R(qx19guzyfqurr!}n2qOz z`diMqbf+TB2n!w%ZmnR!Mn!r~ba!|6mfywxBJvYu*V58rr>CbaUGKgujIiKw7|^g_ zXT{9Q%E~ltQ6R&FdU|?XX&OdYoDURek?&qExZk3G;VinoM)H)NJELTQh(A zRU8J75f(hcC?qV$M+rq~dqg1`8>RRziNnLg&;0#+$r%^T;{mgkb85ZODRbt|Z6v1T#^hgMx( zZQ0eJuhRNx+)H#Cl`zLiJi|s2)?Jj0usC0^R^k<*5VTd4i9jS!L?#2rBP+7YCL84e zi1QJU2t;vbm!Hj{tuE0L^*rGUp6-l%_9n+7Ux@I+doWSBETbsuLN3i_RYDV%Y8OU!WB zzVi!%d!VXw3DMW!{yv_&iy#KUqZA&^JhQ<+Fl<^DQVTqGeV9OMIlCQt7+O& zOO|DQ-uS*R87+Kht4^r?O?X0PF)N#0009JswN)_iHn5>dx1kAh4@lpu>$;yL$#s@x zewwCNx~_k-u?GYO3LJ3q3>Q(B<(_GpKauOYl046o?fF2=38-)_4K+=(7RT}Z9d1zo zfnmcV;*jGwAGdtPK+JIwRaI>nhA|!SBoG+Z+AZgKe%YlEKwwyFR}cijdm9mG@sS9; z*evT;#76^xVZ#fDDvIJDvTeH|Am&~nL}3`dF&d-&yUhPd?c{8DuAZvLM>`k$>fvyg FegW9-Ig9`R literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/cam_tracking_out.tga b/indra/newview/skins/darkgreen/textures/cam_tracking_out.tga new file mode 100644 index 0000000000000000000000000000000000000000..7835704d1ee44a20439d5033ce85cf78cb45fea2 GIT binary patch literal 4816 zcmd6ryH6Zf6vk)n?f_1abV=(ba%H=)#5-bnEU*&7h(~xog$b{kF2x$JZLp)*7$Pjv zQ{*2&NY;i1(Lv-imQq0#5h{Wxh`E{HH|#E!ENf-YhHNpqd+zsr=iJ9R_s%%ZXHMo9 zb7Ic*lC-tfdEetD9nt;${jYX+cW-QMZQWU0TN_+iS(!-sk9$#CSm*%(QkkZFhIKP4@Kk*kW2(=m7x|222#BwTxiV>gwv) z?Ck8T@$vCLp|!NM*jOxP%gV~^{nFA>n`~`u4O&Im=mP^54qP;(_8dv?`1ttR`uh6a z>FMb=eiU!x@wlz3s%n;ab-4O+5!^nwBn3pOg!d!`xN*x0D{eWeEm1}qZ9 z@(@9{va-?+4i4I6LqmggX<<=c6clJ!uu+lTkBFL7D)qe|$}!9ZiM6%0+0M>Ro76vA zSkz}gfrcgi4~RsLj*dR}wSVpC=&%(P6&K*Tx;i^DGNL#oW{3p~Jraz7h6NiH={;3s zdwY9dPfbnzhR;P}F$@Yi3otJWEiCi|7|^g_OXo>e%-;roKzO2ou}fG*O}|SEi~0;G z(1?h?D3Qa%!!P`O^m|q$l1L!O01bRTO3o12@JewzKwT0Ya<_V@SO=H}*$Ekp~8`V1)0 zu*83Kc^cAq41mlaw5Fz}K*-R-LQjCX7;c*3N=FZuR5mI90i8Ww+0$qYgIE}rmsDFDuMqE(40p$2fMK&!2-wd|TqU8D5iY=KNSwAjGx zyWkAT9F$p139U>CLj^TdQO673#C3^)NOFOBTsGK?84{!7%*#zDlT8U*WI`O=t4}T2 z485ST%j=?z*EjKx14*d9d`>NWlDb`iYP5COe_eHArP-@sP6xD@vl5B%vBc# z^PiVON^yaUypEJlJ(9vdBuz-icPJMMiI|YCIH6p+Bw{XZ!=HK$3@)brtIjumAwA`k z`iP5ZaCM%apHH^8w}*Xombf`RJuNEW<-Z`WEup+nh5CwDkeARZiU#vRYyW-y_IudtVZ}v1MTH?2ye*xffCNKa1 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/cam_zoom_minus_in.tga b/indra/newview/skins/darkgreen/textures/cam_zoom_minus_in.tga new file mode 100644 index 0000000000000000000000000000000000000000..a1da27bf892d313165253f83d960b17c221edca2 GIT binary patch literal 1462 zcmZQz;9`IQ0R{&K1&)3Y7bgK$+nbx4`yb3=1d$+Kx0#vQe@2)%RfL&fW`m6GOh`!h z&jez@>|jQg2FbRAWSBuLGL#Xpj4B?Yt|3hzU$%n$3}#U`>^QP`3n(2n zg3=+Fg_#a1SI`Ku0-U|UEKDm1DxlmA1WmvZJgCB;GK--X6j)#u&SDlU0agMeLV`kF S!#smM{rz+!+&q0;^%wwo8@ZMM literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/cam_zoom_out.tga b/indra/newview/skins/darkgreen/textures/cam_zoom_out.tga new file mode 100644 index 0000000000000000000000000000000000000000..2e9519d72451c32b3d5c0f40770fda52a3ef3501 GIT binary patch literal 1434 zcmZQz;9`IQ0R{&K1&)3Y7bgK$+nbx4`yb3=1d$+Kx0#vQe@2)%U4$D!R)O&~9}g1iW3VS14?<499IYWc_ub{r|B1(XgOLFo|8!c2#hDq7*CvRtzLUf)O&~9}g1iW3VS14?<499IYWc_u_GVCmYfeZ=_zz}bCOEJ#14uz5II~lv zlnGXPz-|>egan1UhIs~i`upidxOw`x>M;NS6VlZF literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/ce15fd63-b0b6-463c-a37d-ea6393208b3e.tga b/indra/newview/skins/darkgreen/textures/ce15fd63-b0b6-463c-a37d-ea6393208b3e.tga new file mode 100644 index 0000000000000000000000000000000000000000..046e69688104f6a3298cda281b632220ef095895 GIT binary patch literal 2755 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 Bl_CHD literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/checkbox_enabled_false.tga b/indra/newview/skins/darkgreen/textures/checkbox_enabled_false.tga new file mode 100644 index 0000000000000000000000000000000000000000..c29ed89c64ece7d183afc8292a96ff1bf671a97c GIT binary patch literal 657 zcmZuv%T9wp6onGwBQfbG_yZ;;LfuGd)D*fBND~VfO$xc=h%1zLALHlE(zevpXk# zymz-NilFtme%uDh_-mQ$fehyvN z(e3KcjV>vHv@{F@O0Q=$y>jI(`(_{erfI^oOjxD`%OVUo20|PERVuG-+pz6xl(u6- zvK8%T%CQ~Fyf|9WWGGh!ZWwc9EDCsP1I_sLVJVQ?4niV;6LLpF~m=~B68ZWM! vyjnah{^^M9=*RJ}ck(wG55xX;IcH)r#7K$!&87Oi6s-%Li{G&lLnr75+zjSN literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/checkbox_enabled_true.tga b/indra/newview/skins/darkgreen/textures/checkbox_enabled_true.tga new file mode 100644 index 0000000000000000000000000000000000000000..c8904bc603de58165888bc885bc058aa2eba67c8 GIT binary patch literal 548 zcmZQz;9`IQ0R{mE1&)3Yw+SrPS6`aev3mA|GYmi?tq~*!CK&VM0@DiPgFbWsMgB7_ z=x_c2Qh<<;a4|gtlIk!sGyBg3Vu4KoG9db4@=Xqo4*wal!rcD1fLM4`HhOz|{bvfW z)&GC*-h=Yu~1ma>^zyxzjLPGri7O?6GW%2(TL0nAL ztjMZCiYHYh{;#d8{oe@I`Ty22Tsj$HI$Pk%S*~xL_8(*qZa=gxSg-(MHZzEYTVdPw z?c4vefE)p0V5$qW)lCa=Fn~r_dWhSH_KI9^gf#&bGcbVUJHSp%4s?RVG&miA2>{l< B!H@s| literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/circle.tga b/indra/newview/skins/darkgreen/textures/circle.tga new file mode 100644 index 0000000000000000000000000000000000000000..d7097e3a35bd45ead82ae4a0b4f5b0a6c7277f63 GIT binary patch literal 1068 zcmZQzU}As)0R{mE1&;s!|1%6y%m{Rs7!XSWF*}KFbOowk1jMI+_&gA=1L8O!W&>hE z{>=xfc@MIuLULF)lMafpVXK7#}DGN`m}`ZU)GY%kgQ1%3T1`;y{e99~4d? zzY+ppfeMU)7+t>vP>d4&ps=OH{UG;H5`HlM;ETU$Ks)foAIuC;`dJ9XCxQ4J5R;OA iU}jK~eqm+0f7+Pu7 zp(?b=u?0oeb$#4`mc={EAP6qF)u${~RVj;w7$3>#kE+_TEJ^cypZG)$WLZWM2s08i z2^aghSVd8g?s*=ER=W;_2o(05Mbb1S-F4lK2owvR--yJWYEcwzei}4(orU_o|7ZAB z<%ArDL7916#l>-a!L2@J8OM=Ck|f99$!L?qg>cN7rb!{Rxiil*w>cix{X!kqhjjpR XdVTM&ANx<^&3Jjf{dzE-_IKh3LmZ^@ literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/close_inactive.tga b/indra/newview/skins/darkgreen/textures/close_inactive.tga new file mode 100644 index 0000000000000000000000000000000000000000..30f6e7b5ffa1e2ac19b03163685e10c8adb56d7a GIT binary patch literal 254 zcmZQz;9`IQ0R{mE1rCP)|Nk>|o;-Q-e+!7!4PrH;vKm2R45v<=`ris?fyKb;+TmhN zSoC5uuNkc4^y$<85hjDhz~&*uI|o;-Q-e+!7!4PrH;vKm2R45v<=`ris?fyKb;+TmhN zSoC5uuNkc4^y$<85hjDhz~&*uI5CJ63y)Q`*3Md5@3xC12InX`5d)c4f%XNT#pCT2!)NhDt7mH8MAWcDo&} zaz3A literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/combobox_arrow.tga b/indra/newview/skins/darkgreen/textures/combobox_arrow.tga new file mode 100644 index 0000000000000000000000000000000000000000..d769d310554f0b0639624cabf2b65531717462dd GIT binary patch literal 202 zcmZQz;9`IQ0R{mE1&;nyV}1r~L_0`=0Z16PfmmRI3B(2B{~)>*Bn&3Ns+vIJU{(uA s0!+ZU5Q%2EL|b}##(yvuo7D(0m|H`FLS4f=gFXHIbR*n6eO&bz0GQ(}@Bjb+ literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/darkgray.tga b/indra/newview/skins/darkgreen/textures/darkgray.tga new file mode 100644 index 0000000000000000000000000000000000000000..e69be08937e11769435b050d9ac1ce1ef3e5c367 GIT binary patch literal 3116 zcmZQzU}As)1qKBM2?mW(Fd71*Aut*OqaiRF0;3@?8UmvsFd71*AuwV>0M;7_2?})$ S^9=U%_tTAV^Yn4mV*mi%|K(Kx literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/eye_button_active.tga b/indra/newview/skins/darkgreen/textures/eye_button_active.tga new file mode 100644 index 0000000000000000000000000000000000000000..cac3de53374bf3fa62c779f2a5194f188fef03a6 GIT binary patch literal 2552 zcmbW3S!h&O7{~A2$xLEmqD2Hj&>|{`wl9LB;%=hRkYF~W7T17^Mp5F5+nGs>*^_at z5#xpmD&nq);)?seKliNpPgNW>>Iv>eQ*aefzfB+uPNuh-WpeHu>4e0vy>#D4*RMVnGi{!J*>5=77dJ{G}Am8K1k1ejT zu~Gf|_gAl8y>#Qo4S`#}e7PFu&6_8G{P^(!F4f`2j2UCILq1QRK5e&<41;@-*49?_ z>(|c$3G>#iTUxSYi5h0jnk9ei*s%dH%>fZPFE7s~aqir?die06E?v5$O`A4-f;Kld zTWF6SJ**Hw%gf7EPd)jgM~@DmVFw*Ka-_(QAa@7~>F zZ{EBq9H^sueF#p=6o(x?e7MLkIWtsCnA~Tgm;78yi5H_ebY*4%%WwLYUPHQ7QJzYnR z9I;-+<8hh$_wUPFv0{bd-?lbq&K$8gR#jCc!;~=Fwrx{*_wL<#@#4ilvz+QorKP3W zKBi2E4jn3b@A>oRiqq&mQg;gL8-`NYfibpUxpL*RcF_$RHYgMdDKj%uJ$v?4BoeWm z|LWDN|6#~rDAQS@C)TcAYx@?NXh7fht&Z4a!n}X~UWX1HQbR+7?C!4zMp6RZJgk`7 z+FDiB)z#^{y?ggs8L6%5)2EBJphu}OTV0-KV{B<@u|tvk(V=Vx+)2jy^XChEj1`8F zW156w?OPo@c+lDc>Fh*Zb1q!C zP|$(H#zDhC@+j$Q`X>7FHq)$ literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/eye_button_inactive.tga b/indra/newview/skins/darkgreen/textures/eye_button_inactive.tga new file mode 100644 index 0000000000000000000000000000000000000000..6ca8feec82df41a6a97d1c948359d2ab721b4913 GIT binary patch literal 2889 zcmbW3*-sQ%6vnHIZfKe%vJIeY0>%UahD8F15cVBp-(?4tMWUdhEZ**cutgYr;&EQ) z|1&f5I%n#4usRqg(F`QrT~+6N-}%0C?!9GM0n7c%v7CRueRXwZH8wVGK6vop@2lIl zZ;Q<@?(ig{uCDHntgI{<92}IlZ{Ld9-rg3^hYufQXJ<#u-rk;A`}_Oyn=wZ0(a}*M z+DTuF%FE09XJ}|hUc7iAOG`^KKR+)E3k$NixTx3W`Sa)E;pxiCid?L&u8O_9ysT8k z#l?Sl@7%c~YinyVGczNzv$G0d#>U3PH$FZt)6>&3H#aAwkPA={q%%dDnwpZAFJDS# zW~RiViwp9|>F@8CjEoE^FE5w2wl?YP?3BK~J{cJq(HIyFz!o(cP*14D1^^%clla)! z*w8HK5R167vNB0ePnXitQmLt_5ywMmX=#z3o*rdE0@b65cuY|qTsnkSjf4=2U)<{H z!PBQtg?uW#xVX^DJsywb zKDfXs@+K!IWq5d4=(RH#ij$C#Aj!$e5<+NXMMZ_GZE9*#PkVcNH3Q2G>6Y?AZj_Ib zT)uet@Bls@Pz)OJ?9-=D%84_y6VB@DYC$7j8~EcBvdR6a2=q0UhX zF7nK!kAfcfuC6X^(akbc0GcBykjAE_rb=yXtu!|`>-VEak0c0p40mZaPrAFi<;jyL zGB7Zp7J`E$IN*ZQ@9Jg((MnZJA|6l#)f&j7aW5?`O;S=)!thL$v({Ae5+*sI|3K%b@){=b9K$ zTtV=-2XyXqHQ-_gGsX~;2UZm)NE^LM;AF-CSeBkS}V7LJhN%PEA&Tv5u~|Qgl8>+C6b+; zEw^sn(iW>FA!0*e3bwqTkz{GHqVZ$UMGxXw zJi3Pm*{MA2WV&zaQURH9VOkMINKsLdE{I=sE5%fRA@~`VP?$yc5m@vbh>D8Rb-`&7 z7Z)e7v9a?17&ObzoKP_YXJ==+i{j6{d-o(dI$Gl6;vCH4_xp8^P_Z^HgNa4DSVN(Zq5%d)5P0kL>(^qqb@1xd zEAi5$f`S6!kR}L&4B!^%A!2Mw0u1D6K8}x%6&Wldwzjrpb8|EN&DnqW{{4ILaiVbo z0l|7?yP>m6;qiLCdNvqhZOQ{VEa3F?R4oA>$RMv18f)$D?#co06Orrd>$=b9=jUtj zoGeTiTT2ijUQSO!!3Pq2A0OxE=UOtbQ~;>Hq}Uu>j2quam>R>@Lb)6z2L}f_;dlju zZQJTRb%F`Do{677e^vt6wcTGK`F(hJs6ZHd%te4jgX#FgJY8O1>I?+}0gc825P{dD zfD3A;N*5A1(2kCd#NehgI42TKYkfYSBqk>6oN_1?78dGQA^khtckkXQ=1sh>aAI)r zlyUdJdGki@-@h+0F)?!Y?p=L3;{l3YOx?V>z+V^d8!U^IORTeRCPuMJNkkx`+$8u( zF{E4)Vbd*saOCUDBtXRdAP*P}aNZ&Rw4Gh;cNPPMUMVd0qRV+ZT5#WfC!KfRFX6Y} hFV2xV>9orkgzLY-{-NgK_JQ`^o}$r~_O9k)>tEAzSYrSH literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/ff9a71eb-7414-4cf8-866e-a701deb7c3cf.tga b/indra/newview/skins/darkgreen/textures/ff9a71eb-7414-4cf8-866e-a701deb7c3cf.tga new file mode 100644 index 0000000000000000000000000000000000000000..8b9d012a9b82fbf1948d5cea62bed9901fb64bcd GIT binary patch literal 804 zcmZvbOKJi^6h+HOLdeJ^WCO|EQAP<7LIU}b?X;bl8xX`FIC136p`eH;x&=W*X#a=` zf*>z_UTHx{gsys?x~Hqlej0OSPM?^Gnd{3)JRW}xuOJl;!nXiIF>1Hll3Fg85}|^e zhl9-LbLsVZQY;q5_kEp{00Z$rQ7RBwoC}8ObSkY@OQp?bqjN5o6Ax(cJaCi>L>@27 z5CnnLYBiO-^?Ge%nM~#%N{+mfN28Hct5ubgtJO-**dv`z+uK2OS2ARsI2;b8QmJUn z=P-Iak4gpB$T(pz7)ZHXR^fXxnHsN!FJ= zo6Ur_@xveba5(6k&*#Mh+B1T6XApUIb}iQJcBN1#sK}fI7%JOhRG?FfY438U)MBx4 jEgOLE!mHyNyaPG?3*KKp?mrW6iI?Y_uZP6b{jK={<(K%> literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/ff_edit_mine_button.tga b/indra/newview/skins/darkgreen/textures/ff_edit_mine_button.tga new file mode 100644 index 0000000000000000000000000000000000000000..01770a3c44616c79c573a07fa7d543d08474eb39 GIT binary patch literal 998 zcmZXTON$yo6otDXgkgw@h`4eQ+$Xpi23)up#}}jVO-4lqU#K7`3W}o89pBFpSMJ>U z1N?m_oNJUc2xZH_xE?HfQVc!2d~!)pU)@q^Z5*o4CVFp6@N%lsk=dV_T%FtG)=>Ly@syq zs8*}U=ko$MolZC$4$uV>jYgphrNIcnmF_PUAk2NT5(C;OXhBlrnNX0sU@ zcdC@!O8H+;dwJYwG(xM@g45}gGPBt%D7V|~@^3Pkpc_!%$fLa3Y|4?>${8CDhhh?Q zjYdNd7K_Dz)0kAbnv;mI-O!(C={UcWQND%F%-j}?(Xiu1NUq;3#-)%o6Uyd>FFtS=9wab6>|=Axtt{5 z+}xM~m&=8tqa)1cb5Pc7HYFz<4#Vs9g1jATG^8DPL2x_G4hDm*J4JU^avTna zSYnY>DuqNMfvc-41cO1Got+^R3JHhzl+)U0F8zKV$z)PQq!DJf+XeQ>i~V>!j@#Q? zoS&ZyLNTgSNBuq*&W=%5?2)244oj(2!t?X9G{$C(QS;Im_W|{@*-Sbvm&^G0_<&+f zEuYV$dw+iqOEel45FZjB1nZofoPd|ql3{`f*=#mgtybs?D4kA2nIMjsu6n&5YPA~N zZubsok2EF`q)5@(8$F0GRjE|Az0nRyOzw0#G96wTmMkPOfh2;suh(lCXCx8<-F55r zI&_XI7K=ggDXMC<3Y|g%WWomJ?d=VUh`smscQhIeVT@X>)<3})qinm~mXb`RhC3}V z&Nn;c!K@?SKc+i={5+dL?Fz3tFd16?;`NeX%+@7}o1AqS; W;?Z9hi9jsyGxYtpFK~JBL;C|JuLFtz literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/ff_online_status_button.tga b/indra/newview/skins/darkgreen/textures/ff_online_status_button.tga new file mode 100644 index 0000000000000000000000000000000000000000..79f2918299a51baeebb0e379fd2179ac19611d7c GIT binary patch literal 1076 zcmZuxOG_JJ6rE98gQaxi59l9g_x=DAg0+z(m4JwDvXB@NRD9qoGl?-0sOwaPK0ral_X|bQ-6`kV4iq|zJKx+n=Y03O_sl3trtPfeRaL?3^}-hn29chZmxtNe zSy7Vz{`tz}VOrMn^}X>pJ{?Kc=RpFgG_Rxxv9fbar;4wY3%P?d^!i<074(pAR32 zDix@tGMt~E!kjY(}nwn5uT`fe`+uz@huC6YGLLm|5QQ0(&43%6%==Agy+VJo& z(zs(d9ERKNhOe}=6zS#V<*2Q#MR9SlbX6x#CBvYfot;5v2^rnp-O?u>f<39Mtc0d% zC@CqC`UIsCZ;&}*ZDnNzCN`FH;hZ>$NF*Wxb#--UXlQ`dYK2au;R@-(zXC-?MOa%~ z!|Lj)w2wxpsHhMzv)TMVf&2S=Xf%pxeSICdxw$wxI>Pn!wN$|)(J8T5?5zSKRdS3Y zJUl!=+uGWKX>)T^8g+1R0A720d*Txgw70hx7K;Tskt#Wcz~kd1w4I$Dn6|gK#T641 z6Jl(N(Bz3kLVU~WbRt!941uSoC+Pe8`^cD{o(BEQJFD2;-NnGb06ZR#G*(b5@do+% z`58Ko{QmIpP`(t7&2G2DX0xHNun=^Nj|hbbS*c_h5-%?=@SmKVKsi1>Mu;nwIRfM( m55B&>LT4(#mE_)j0e^lAPWz9X0;|Jn`~Jmcwtma`s{982J+5y6 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/ff_visible_map_button.tga b/indra/newview/skins/darkgreen/textures/ff_visible_map_button.tga new file mode 100644 index 0000000000000000000000000000000000000000..bce9a8c617c3d3a6e6200c1d71331649855e4fd3 GIT binary patch literal 853 zcmY*Y$%-OD5UpZF+M!R~<-4#gkX@ zKi~ArnklF{WJSD;_aZVfQc=Dt|GyXIMfvu04Fm#ExLmf|tzoHjce@=> zY&J0(jgZM?q=;aEN{%VO^g3ai!{NaFe#hhSfDl4vHVBpySF4qgkqyARr274S+-^5X zZ!{WkyWKFTj5c#EmrLlyViC4nE+=8;^m@IZFSw&J#w75lqEe~g3-=0z0_ZUBhK98j z`~4ofZnq1i-EQNZmP(9jb}n>?@;2C!U@(YiGz!5AL?{%3qG=kI7UnaVhrjVggMqvThO%Axd|vvbu^?j8 z=@d?<6AK2bWLYGJ!y(vDf7r1trI#)*TY(jsiUhwJrfSjHRS*nEC( VncV9iEvuz}f6xEae!c!s{sLbDeWL&X literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/ff_visible_online_button.tga b/indra/newview/skins/darkgreen/textures/ff_visible_online_button.tga new file mode 100644 index 0000000000000000000000000000000000000000..c888b08c7ed85fdde7709e9b6a3da109dc218eb4 GIT binary patch literal 1040 zcmZ`&KS<(X82T+ahr-D1xt`DKM>m|q$MbvN=Xrd;_kBM}nvq_AbJCpj;r(xm z#R7>(`tI&-f@FT)-rgd0cz6hzh!GLKxw%2A)oMW|Qo`5Q*VwJs>zLZu*nr#Z#=^n^ z^m@I(u~-b*Y!-1c-qmU~5KyBSTwPsZr&_IIIvS0_YPG`Ua$$RW8(Ujj2m}HGGsYYZ z1zV<0F&Perh?mP{%&x7iVP$0nl}ZKeb{nBkNSJs$9{Bx!@M6r76Ap(_C=@^;9cZWH zF&GR`DwV*BmY0`B!Fc%{92{VMeH~`A8AhWKG)*RxObL#|;Xoph5L$ZBOU>ir;sW`6 z9yXf|xm*r$Dl~h0dx9>@GITnfunPu*ldPINyWK8y)GO6pUS5i_+3>g3@mifu2boL; z^Yiont&Ufw2Mv{p$B&MVFdKD67R5Hj zd%Ygi+$%=73S@|xQ6p2WSdB&_?3|vSVwxp#S4<`ov|24xDivN{qri+YM~-02)F~!U zPftko`+dknO8EKt8L9L0bI3#tPoDC4Jf5J*^ZxtfUCwW|?@M2ozI^`p!@lIOeUknF D5H)vk literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/flyout_btn_left.tga b/indra/newview/skins/darkgreen/textures/flyout_btn_left.tga new file mode 100644 index 0000000000000000000000000000000000000000..3060d8016b2822fd3011850d4b828942fb637533 GIT binary patch literal 504 zcmY+B-D<)>5QV2+l|Df)i}&qI1Pek;G-*P_9}op4BzPf#fHg)*A}Z*G&*)P)aO&=2 zSr=wuKIR4VLI% zxY=yLgTX)(=6Me8_xm8rvXobrW#Hj(2r^AmYa)(g&0hBPjCQ*nSR&8!lyJY_gXi-( z$oG8>Efxz>J@M^Wv(D{4@i+-us>#1dnv4!|1 nh9xnXyh^Lpg51dEa*^cua*xaYI9|hVx=q{q48EIYJr9V;;MbHZ(B8Z~ULz{IKD$_MFPZwt3JM(l8 z(U#`-rXB4!YhBk#%}Y(&tHon7isLxuu4x(`@88u9bzLvyp{gomS(eD6D3E!cBeN_+ zrfG^yk_0KGL`G4B48sr^1Od|beWd4kNY`~IuGBAE%d)t49A}DtRR|%tvu%5c|2vyI Tycs`%c=MyS>06`HvpY_ss<0JJ((WLL7 z%_?i`KMX0!keNU8&$rk5_g*4(Vtz^aEMID^`uch)Uy1Vd@>c$X@81*tNU;Pz*T=`l z!H3PwO=vcog|)M@gWcU-9336u`1lwnCnq>P zJ;mAC8P3nop%)hy(96q9$ko*qO4rxdkkQdmuo{Q7zP=7yRpC#iQb?!M$Ye6u-rj!a z*W_|Jm>P)p(n(gLg={5UNLS*Y$d|#vK}V;W-vQDi@CWu5WKLk09{;MM2(kDINASc7t)n@rT34# zleV@t4~iDb@bEB{2UjyTHU`osCnqsAHRTk*LQE0L3jC~q78v<9D-f1YVhs|FMm>n` z?r!*KVqae$w7dw6x%3JRS#$^wB`c zqfCQzmHLg+p`oF7wPcsbmWGCg3MCT`hoO;31QvP3k*1_s#8qh%!j!aXV@m`}AQ13; z*zuTDXEc>YtCIxOt@K;yw^F&X;e6(>U+B7oLZQmnvfSh|-C;X!agTD3uc}3b$7S=l zZ1&0{J64*Tn=2p7@o0scoVIe_6~3!{SJ_?aPS-QrOK1?2&6)T-+fKQz9J>^IPZ@40 zPX80fPiSIg19Kql&V$W?%rFmZhJo7*ZB9wVBnkl1xrRcqyPW_ literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/flyout_btn_right.tga b/indra/newview/skins/darkgreen/textures/flyout_btn_right.tga new file mode 100644 index 0000000000000000000000000000000000000000..0a2354ef5656266f36fb1258e16784ad3f00b7f5 GIT binary patch literal 504 zcmZvZ+iJo<5QcYiRr&;87Vq1a2o{9eLQnJ}3L$}rM7$6|h|whEfC(gE<`sR8znN*p zK)W!@w;%t&46D?wx}1R;sJj~)4u>$h>)h3@D@A#p!ra>ZOWEZ-&0_rIF{k)Y4zedg{7P>SdDzWwj{Mi?1!H2LQlopaE#(AFSd5R|cCK}@qha^s@e?%Nm5L6I< z2tG^kIaafdoRicBZhjo@`p&w0uf3J3Q07;uD%F?rY*kei-2C5L{)yxtl~d_IaCpoU z=jrJQM@L7H!^1)U)5psM46+_5aTU$damBQ-kDkPaqqHJYl1QV1a+9*@5}6oJHIF_cE5QH@<(T(oHC?(R-I z5i&m0i-8y?1W6u3hCxIk5iBe$K<4M?Q8qU>huPU#%*@PSdV1Qz)y>TfgnC7QcHuJ! zx*&ptVt`CdO~E%gIf;ph35<`AV{B{;qobo385yx?=j!T8%RTB#41l*&FVy>tm_h=E zhlepVG=#yyLG<_cL;Cvq;P&+NSgblfKYtesZ+A&BR}1AX^#cO~AM{;aUFhuWgmiRt zprpOM9c^uGmRfdpcBb7I8z98f26}sYK@)@sDK04lw6?ZFnwy(Z+SJs9#>Pf8G&ESO zIz2swP+dZKcXzi&SRbE^4`NzcT0oM4)YsReuC5N@a2QfsTMIW73Kh`D$H(s<;~0pL zqKMIsT;qrkA;l$ykYF$f2?PQVzuynXrdZdOWpzwrgtZmjSC&RtT*dAPt0U}@Vu|!e z3O~})oQsPK9X5~sR_wP)u4Udr)4s4vE77m9n+DT@!@b2yHEj*5=$I%iFX@bL%neWq&Vb-H@Io?3np81^!)sc?8(VV(b3Dx3o@*^%Tn1cyuQ97qX*Nju74Ng{|nSC X*x&wOb*Ls#^Xuo=@b{V@)!)=#ZyWGg literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/folder_arrow.tga b/indra/newview/skins/darkgreen/textures/folder_arrow.tga new file mode 100644 index 0000000000000000000000000000000000000000..77d470731b1cf8234902560f7d7ddcc82a74dbb0 GIT binary patch literal 4140 zcmeI0O)ErE7=VwNhy_KmVL?(h6jmq;HFD*n%or^E4O#e#wVz`vA6Y3DR!U0pv9KTu zlscaGHm9y>t{HXCxv4qRbLPywxAVN`eb2o!jZ!IPTBqVwueDZH{zVQtsM91gCseOt zyvMMTkbeyC2b>mSX!0D#0KP|%b_rQ%0AKe{)Gv8BgPceIATG0hhG9FPml%B1VhGPu zX#Lrp^Kl01paxvkqtyD*>35L(Vi8=qW!^YHr^0qbpNB?p5l3A9LwTXQ;C%|xV7nHT z_&@O;g6zp!u$hNS{3yeALca{{U@L~d_$7#a7*ELmjCT!s67XN++=gzjxd+PKf9Uip zY=JxvQ(&w1GEX`G9oKAttlOs7%=Mf92Img6I&w=4ar^&;bDPitwsUUQF7LAb;_shZ zj;({MoEQ5aaG56cmYmDFqu03_%kPhSkoE?q-f70JoY8ql@qB^AunRVyEm2S0cm(Ga x>_HpEUFYg}FV0oy0$(|IwU+9<{`XJGoST0Ga`OwBe2@+1X8V>Vg6T}Z`UX--l%N0r literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_active-speakers-dot-lvl0.tga b/indra/newview/skins/darkgreen/textures/icn_active-speakers-dot-lvl0.tga new file mode 100644 index 0000000000000000000000000000000000000000..35846cef323fdb360a7ddfbdfeb884b439efe19f GIT binary patch literal 1068 zcmZQzU}As)0R{mE1&;s!|1*r@(J;V~2IPU_AWTjg$p`9#fqEc=R5RYgGy`c6n^gV# sk@SPur0VAf>gk7K5Svu}Lqa{QGzbX_bq(_j_VoADjd1hyan)l003FT_ApigX literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_active-speakers-dot-lvl1.tga b/indra/newview/skins/darkgreen/textures/icn_active-speakers-dot-lvl1.tga new file mode 100644 index 0000000000000000000000000000000000000000..1f9f564fa95c3b09779f46b027469c5fb2cbbbf6 GIT binary patch literal 1068 zcmeH{%?ZLl6oen1yd@p14QNX66d@ok_=h)3u!Jqa5-hv( zgj_T5m_IZB%diKB@DRM3(1hJ)UDxo>pWooX8!o?iM|qX;x1Z3tntlIOmsc6x6U^XV z=~T_W*Y7Q`wcAWjkYND%I+#prj)s4uFkeBlG8qaer(HIr<@3r2-;Jh~DMq4y&M)k| zq;>a^KLE_lNVCu2aAoVc4FnMfZFu740f1Hel&j<(~SZNRv6zUr08SLrrryJqs J>Eo)$000!N4od(4 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_active-speakers-typing3.tga b/indra/newview/skins/darkgreen/textures/icn_active-speakers-typing3.tga new file mode 100644 index 0000000000000000000000000000000000000000..031b3ad34436e8d841c1db08c6ab88cbbfc02161 GIT binary patch literal 1068 zcmZQzU}As)0R{mE1&;s!|1&^wJdg%q7#~D~_#jM3%pRx)2JC?hka`de1NJ}$E-{d} zK1?B$O^O&uElfSg92lPzF=RcXY}7Cu4Ub_Q90 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_chatbar.tga b/indra/newview/skins/darkgreen/textures/icn_chatbar.tga new file mode 100644 index 0000000000000000000000000000000000000000..94fd6dc8928265fed5fc56b3d48c38d311b91c41 GIT binary patch literal 1075 zcmZ9M$xB;N6vkhxiB<}Qu7qydKfo>pA>f3yfzm>1+Yl&pW7Lfk)P)P-Mcb%t7b+qZ zG){?PG>Q`nMw}I?g5pAq0~P1-PxyMi14e4#JKTHTJ-_qizI&fxBpA29L?h979^aIb zl49HoUgjQ3NEPLXVtz97ogr32YHn^WN=iy#v)Lf?uRo%XEi%f;%gaMB7({n>H@H-C z4YkoF4`h^_ot+J{zrP>WzP>(`mzQ%9^;Z-UeGxtWCc&s;h>?&i@;RMO)YsR;)6>%f zD?9l8ezdi4ZKqB^U~gm(d@e&!@}iVR(2L zlarH}nVG@-{5+PHmSC=|tRQZAc^L}}3kZk9+KRTh6Z!f1gl64ApUN~s7~dj|%+1YV zb#)b+o156$+Cn4}!S3!Z_V)I$v$LbQjg1X$M)yRQmX;Fx=?+V;!IqX5{e$$jzP_%g zgM$Mc9UbBH^c3d#`8ndw&dzXre2o45eQmn9xQLOF5x86~LX-Z7X1LvM%+AhYZEX$P z+uJxiJOmM!mzTJ@x`OBW`WlvtiwkW*DBXraA;QACkE71R#&n*mYkE56MbEFyPcIq+FH*#ZTB>WP&MXyCxy~6iydlP`$ ZZ-SBI_>lF{{@(uXZIbhq{Y}Zp!*4zI4*S{^)NY@USu(t95x!J{w$CI!Z3hM zEiN%+eIPb2b-2VS(GPPk$P8q2aM^_{4$}*wVdB`tU~=d*Of9kE=;}uKh;Sz=EMTQU WNKmM2m}ju3zn^Y|o2QSf9s>aK&nT+^ literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_media-pause_active.tga b/indra/newview/skins/darkgreen/textures/icn_media-pause_active.tga new file mode 100644 index 0000000000000000000000000000000000000000..8988829aa77d0f4152be5b33a62ed67c96a8e68c GIT binary patch literal 3168 zcmZXXS!_*f6vwwiaW!73wLQ>IMGnLd4bc-E|0;fjii@Vt5R+^VW7cj?ll?ur#F z+?6X=x~o>La$8rgUhNvdPyn!3b7%78$vFiD1>v%?vhdoqYu#()0KVL$sg?OGP+#Q4zd3kxJqN-QB ze*O9%yLa!F_V#u;dGch+oq;NXY~Q|JmMvQ*dP~a7%SD5bnKNffRGpEAqM{-RLDtaF zV8{bOoi=S6d8t-$dv@;JDQ#_Sa`x=m6zZS@2M);c<;$hAveFPsOG~Asq$G{(fgA<7 ze#VR$5`rC3a6D`3)Tv?p>MmKbB)N6#R^vT?{`^nf@L@T0=#X@FcFLA5Tf_t1*}QqPcvPK7 z_WEtwv`JJY@w7`)SwDXKxUmk?;3L`_y|7-na>YKLJ9kbfMtIk)TW8$bNA^3FaO>7B zxqtt@+`D(res5`Mu@K1~eq^2#1MzxV2r2s0r%xMGNJ}EVX3ZMmiUs_qcAOO$nZ$1# zPzOcJQ7FC#4<5+NmoKHeyW5f5uj z2JQ0Y%f^TN!V%N_;Q{(R4yY_(=4e}jOBRjCfK=r?Q^G3dZ|86c& z`N#@9vy3~L=O_-dhmRpDgQm2yQm7s}$ri~k2tHwTj+ zB{Jzb|3%LebNlw~6umwaT|m;y_`|T-yLYc;n(icOM8`!63n4S%^#QaA&TK`6%yWGl z&AngI2lOGGz;Pfcht$AnYHG4<6EA5&PNr-iFKzbW!v}f){=Jp!=+UF?wWF)){LJ$) zW5%S&E%QhpkPp-G8&TL^WW99hlEr`R+BI_qdUSzWAN2IoN8TvYhYufG4o8k0X=l*$ zu4JB%8Z|1_bod`a*?@ki%HpbINir5Z`^+#N3bG$OW9WnQ$UI`i2=RswA1?iJb8|(v zFR^xF50e<59BxG|*8h_ASO3BqZw&=VJhqU8=yQ4+1)?;rrO3fNio-E}bFiu7)G9ad zKU?>mux=@?mXO6jwk}@0Xfh@e3E>^0f^`wFp@SjSjPIHw$YPF|2<^ znzRG}5#qULjbJErVDxLz&c>1;Sg$qNu4cAIQ_!u^_o4*lL_Sf63a&%{CfdkTGRNq% z)zCp`Er~Ed)S~7yqF`|?<1X!_g#Pt40lo(2dn%RRq7;5K4Px7~8s-2*F#x0m9abY( rue$1ut1-EnBR8sUxy`yNxxxP+%1X-fDhf&qii`fP%r7X+%XR(*gaxna literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_media-pause_disabled.tga b/indra/newview/skins/darkgreen/textures/icn_media-pause_disabled.tga new file mode 100644 index 0000000000000000000000000000000000000000..4690f42561d13d8b68a3c9ef73dc078249de10fa GIT binary patch literal 2287 zcmZve%T6O#5Qh8UVTK{fGY|v9-0yb`=4PsnmCxW2ZF%wcY%u>i_?$Q+*oGYxLaD51#%ue3+S;@qXvy zWhRsH78Vwg*=#nqw6t`X%jM4U`FvqzWu@S+uC5j?*4EYvzY+Utettf!v2Qi@PGj#i z_CaI6YHX;XVM#;7^7{IE_$%>^v$L})y^5OmS@S~86U`G{l#!7U>FMc_wzf7&CX@2M zsi{cF@8Ci^0J`F`b>A0*4Pry?&&or>AfA`$;cJr_(YpFd%+= zd%GBn4i68DkL&lNqoZOVtfn_;cu}uM(x#@SY$^g>U0pVj6n|`NO#T`l9~XlYDyc(T zue9cT@=5eC?nCYoULw3QF)<+q=T!2F9BoHY(U289K}Zrg|JZP9MBQk3Qd#b-d>t^s z$h;%a+uGWa;Q07By7T`BD_KG^=mV|FX+8Jo(iGZ+IiEcWY%IHWdU`6s`T4mdj*gCO zKVztIs8uu&vA@_oROSaCy##itiPqHUbui@Q01ZsBvhG9=rH2D0N7$Xbd2UasN8WvbVP3(+S}pNFE3QHYS1WXUOow$d;A zSk!?)$;%M7MErdSF^_(4?d&H569xNB!*ncHn>JX+i?5&F4X$|+9{Gj4r x^$II6{h?01goY*6OHM-%Rpab$jW2v)$^GoS`6>Hzemno;M$a!x`L%4X_b)8^aUcKy literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_media-pause_enabled.tga b/indra/newview/skins/darkgreen/textures/icn_media-pause_enabled.tga new file mode 100644 index 0000000000000000000000000000000000000000..c01399e270a253a82eb91c48b0b93dae5a394257 GIT binary patch literal 2705 zcmZ9OSx*#e5Qe)MMCF8&oFh3gY7FBxpo058E>S^H1Z5M~ao@&mTt;#4X|@v)+!9U9 zc;XTz!NhwL{{lb2t4X*pM&rbI=S`h@s%>M0H2v`{_10T&RekL^#ZLHB=IHO3|5mM9 z<#h9B^qMtmoW{mRr@6T~+Sb-qyLe!hxF)beX@FVMA2mB%9XZ#;>3wEVZsEN zG-;CDn>=~4cpMp}%g$>3S-W=apdR~PQ&S`J=FJnYtgK85r%jtCOP4McT^02~nwpxV zU;P(X3E8Y!DOM{nHIh{azOPuZLT1gHB^a18Wr{3YwoH_+C`~zf^r(0m8YyI?agu`v z4~oW2G!XLd-o1MR%S)Clky89yzI?f(gwy(r;0T7NPMs>{<>k`a+A7#ObLNbsQYm|% zI(14;oH!vGPcsiF5C;w%Fo<4*fC|>e0ipiI)&IBnSyfdfu~^LBcy<2#dAWS~vRt}! zNiJNtAZO2>HJFnpPl~E#d|(m6c;NJK(%rmyvtj(DKwzXbF8TTM=NkoZaO>K&YjX4E zO?!8AbjZbv7Y!3Sr%#`j5C@tbA#*_U4j(=&-C(*~wrmjs{^z1ai=vAcFCNmj%$_}4 zX3m^xYI&X~zVH7;3E8C6X}N#@zPx(%O1zgZUrOPN7cZp0zu&?Kx4ynU@t;3`E)Js% z5p^}wE&oauE?ii-Tf2p`t|E_<;oR-SSFK^H*emE|Ni}Zi9CDu zOwOG-L`F;Xi7vW{DqASFc_* zgD@T(9Q*5e>uGr8qN86fnXpXZ>&AzDWcR0bwuE zv00Z+WFUmxrBChIvqy?l_k?zt94&|{Cf~7(-x(b97`aSCEI^<^f&ez54-gO;FFb18 zC7Ur=q={Us2*Y#c%(1pd!(h>zrnz{G3YenQc?T#oY66M_AO$G9cI^sy7z*<+8>QBx z8mu82GVLzx=^jiS^s!L^fUFVF0ERw-cA-xJ3=*TaXW=507%I}@cU1WFj2ScX+INg0 zEf&u+*o+V<;K**;LjXeZhep^DfN&=gKM!GC)^V?hn?R!$SD?4tdV1>`5Q1eu`UA?K zVTyZD?+npX)}$yc8dg|9gwdy^ID{^PZZ2Vi&p$xTojVt}w1#g)AcmkNJo~08j+ju0KA*1S^?muUC!gQqs0^>JAL}}?}}+ypH|NNulHoI!B7e)w1chbxyBO9sOcJb3+%6Y{d`_d&}5=i-BDP2h@u zLCR{1k02IJ6iGmWk$zbjI}g}GcrrupWe0wEB#_Xp!XaFzA6sA=@=zQ4JK8 jn$YdZd%7oO-FSbz5C?U1LLKdre(^b(Ql!4x1@y literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_media-play_enabled.tga b/indra/newview/skins/darkgreen/textures/icn_media-play_enabled.tga new file mode 100644 index 0000000000000000000000000000000000000000..accac38b029004a207dd7210febcdd6ebd0bc87b GIT binary patch literal 2540 zcmZ9ONlX-Z6vnFnQJKU{lu3*lL%V?sxbL_Nf+8rJxVHP&Ztc>FdsWlj65|YV@zhSD zF(K)bi6@tn7f*dP8e`g!XpBq8c=Ph+{T@?<2q~(l`q%fp?|aL?9H+zye##vE9r5qV zl`EYje}=DKz1nGNYI0gyT0-sZ?RC3%?+)+Zzdv&1$dTyrIO( zjg8g1ytB2nHM3*Kj;t=v?c2BS>!Cx3^2d%H%d=9);;A)K#FhFa z2M-<;^-RE63{?*Q`R#fzns_?9hO=BVJ99{mIY@Z`yprJ|xj+S=L#tTSiMNHiL? z^Qlv(+qJA1Yq);3T83j^68x4iVSFQ0sCC;jU%o7t zE?trf7cR)zvuEYx$&;d)GA$?wC_FfB@s_)J^Jc^UQ%S&&sVDh)^X6Ija1he9YuDuF z&6{@a?Cg|_7cUy$>C>kNIgsaJl>?J^`0!y#!RKz-vPCd@%)*5WLyHzI%IH~U&6*`M zX3VfGd7dZnczlo{P!Ws8Ohr#mk34$xNbcOZWB+3ss*+Ip*yn0lTd|E^uwX&m{Q2{< zDA2QLmM!XJGC9a`{rYvea^;Gk1h;(Om&cDE%bPcE+?_jj%KG)|Wt6r`L@obJNm1O`9s~{uK?UFlz$otZ_4SFL%jKl-_3PL2;K2h6 z2WcLeN?@cL4u_?#u1-d2T}JiDlar2)4hs+aVF<#983_Rk|37^AP~x9HeUieDA3w^I zCr?Z;@gxbvrKYIX5!0tnkLr=fd#VS2e-GaS*|Yb!x_|$^B))w4B5pRDHA9n7x|Gt^ zty^WdHc?cMd`(S_Rou`(2cdl2cF}$B-aScv|NdRv4<9~QLOt-}xaCqdG~{ps4M52? zKtmH32dV&28tU%dyOR9zpj5Xr)v412+!NhVDqXJL5ySs(mf#)dlD2)_6F6e|*%*a)P zs+Hj>+ly{*hCxPrDE>euG@$Sb8{e8WYpfJ-n*tB2iULeQA9ff({a;t>>-6Oluig45**f!V${Mh8o|;-{xho%&1pjE9zm z2SJ!Wlq--$ph1E_q{QG$q0b75mBulebSU;J<>`Zm3D0)`JnUvnI(AR=!H1^bc>-Nl z&~ey&=v-p3v|?Jx5T>-&Z$If_pt0-2gd+WDF?AlaMd;)XbC4Cp;ZZBL8FmqpUD;R7 z$p7)nweQHx3&qd#g+QO^MsM?)?+TB){)e$Q@bRS29o^fiHKtB=AfrcC-_7aq6%1{K wd=D2XWE8Pn4GXDJv|(76M|yQl)IQyUuesLdwwm_(minf~%8uIlhMFqpKQY|RrvLx| literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_media-stop_enabled.tga b/indra/newview/skins/darkgreen/textures/icn_media-stop_enabled.tga new file mode 100644 index 0000000000000000000000000000000000000000..d935fa31716fe4c94bee60c9340c45405c756b77 GIT binary patch literal 2295 zcmYjTTTfGI6g`KT0c1w!!Mhls3ZioH4uWWf04WARxe0iwR|G4ULM#G;o^uLlQHJ1^ zhcaG*VDJ~1_zz6OgDByt2@k|*Y>aQdtl8@;b%d0DeEq()*4}&VeX413TI455li%2X z4;?zBjk;Ve_aBXojjl_VE;-MiKkqnw`n0XCu1-6A_^>v>Bmc;eka_j$)ljtj`6B-X z3UO=JtU*#z5;8M0QBY6-`55i(?I4EGyghT~ zj7MlvYiepVOI=GyNWh;PH*Um+4I8k2{dy2$<;s=VwQCoutE!SRwQJWPyBMyjs={B#j~~a8BS#?Wv2Wi#C1c&Xb)YUe4p9wJ|Kq}i3sa{~ow5tI zW+)uL-;bL&Z({K5*|YFUR9GQ8A!Lw)Duxp$PAD-)j~>O&ojVa9AFqIS@7@goi~#%P zd}^YhRH zfdKB_y$g$QF@%#VU}~=e$g0k<_r>3SbGBN_w8+1Uw;C^3YgH3& z!Gi}d*%?Y3mHNJZ{R-{l$B!_?3@};y7_MkH7LYb!71$t>v5>snssaxmK7>gVtF*Cv zzHi^YA!=@JP9=$TwulhThNomYnoyfIZNkZuCqv?Pw>~j35tc2~E0LK)YuUtfY@73fKVTQqYtSIqyGEn5@}hh=$r zd7!MU%%P8sjbV6r7^eI{jX8=}K}OLROfof^EOrc6Toe@*sa&O}rz?+?l$1Xj_!or6@Y86K!_q&K-E!P|9iq zH)uR1SzKe_Z{|YHFTo`&XV2i^Aa38jt-_aZv32WKq@|@PIvIKk^705>c#5(;c*)BG zXjEm8Fp9Y&A^B7qR*;W$3?V{A8s28@rAWxm&Q>KZI*acI^K@0@*YM4;yT5gWVk) zX>a!DukFdgNBYa)Vi`Z>RN?q!EPU*8D$D#^$j#053!hzL3qNv4s3(q@W)WpujmaH5 zcBoYB*|R4k?eJDomQ9 zp`ZIZn(^1@i<&w^)`xL4*{70`mzI{+D6+D$2H@5c#KOWtOLTN}NESKBATtZiH+>Wr z7h7U*aL~bm5L2k6Q}I&Kv$L~9sHwb(^85Xkn4FxH?wE#{Pp~sGGPt)cDn<_hmGOkVTrFwh^Vfvw#3H9hSZ?>e7>crsj2Ab?CfkZy0*5~ z5_@}ljy5zjWSg6to5{%f`g%(oA0Im!eTr=!9v&tmo12?0aejX8X!G;)w)xtkIlakB zTU(nYZf|cLa&>jpHt+B6<9#Ck%6lrvRvzUr)Ya8xz0?yE6XEOY>*(0S!-ISe3!b+G zMd<|v1>IX)TlVPV<72#MUbo*#|44;%T2xfD6bJ-1`D2=ni|1D8f74g zZpzBatPmI#jK|{U$RD=-HY-(z9EcR(oiPYm125_jkxjD&{N|Or{<>MW~d8Ta} z4esynOQol$N1Cmzty1ai?3CFKE)L&t16Vely@CnqulLFw=BmqGZ{gM$NSV&M2g*4Nh~!OP1_sbDQl zplq>EgG!{nySw}BP*@v>T3%k3>{H2yB$mIXrb!KKp z!o!*disF1Ym~k2m(+VX?8r(~a^zaB8#pGaCbdyAkNF*Y)o0}VXc6KIFv&RJu3>7{H zarWZk;#U@5X~)JPh0lIf0V>r&g!GZ@0>xqPhqaP!@e5X4b(bc18@JO%8M`}t<^oRw Simw%)|M@fUcSWWDFXboofON|M literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_music.tga b/indra/newview/skins/darkgreen/textures/icn_music.tga new file mode 100644 index 0000000000000000000000000000000000000000..81da5abcf290d124618396feb4c99fd7b4d4f356 GIT binary patch literal 2185 zcmb7GSx8)G6uzTPs1~P`fb~J4h#EyKg8Cw;pr&rUEvdEWLj*1QBn;?-Fe-YjYeDLk zsBuf8j{CmrxGy6bx9j@gzC8Gz_tW$JiOr0akX$);{OA7XeE<2*Io};gvXySHA0+F@6Du3KAMdv|bfK>Pdq zw7a`YJ3BkHy}eDFo13(;u|cn2zqY{S9M$3BVGCZmySoK19UUFi*49R;si`K$l<#1E zh1}V~ot&KhWDeD6lvoo-3ftZ<@X}o1+eturCGBYzH7@3@$ zq=|_M8XFrUOGHsuAYy<}B^jtmNlCRzT3VVxxxT(8Ef>=q%G=J)E|!aYytlU}h)`9P zwzjqe5pUnVrPb9{T3=tk10`A(4Gbt}G`HwN`Cg0%{5VLf)y6VeDssO~{q*#dPEJnf z=;%m%$NS6(Eas)S-bdBko?MI)(nMU5rl+T;PGneLUvH9DR#tArIpF*m@dRzi1%-Ny z=zds*0PjoU6ta^TasSWoMA{l|98rre@+T% zs441cFc^+~e0=oCSGMLGVtKMTv1#$``MsuLJiyc5+5Vi{8v%$e~0I548#*d?RIjYcCWPyh*1prHFD2!jHJcvxCm zswN~P7y<$U@>vRwfemPQ--(Fa=dY;27@#{K28dzN@IzAPdve5 zdwV-!^dXB}ZBn2I8i-|YZ!alOP6-mK0N5IW3S8Q0m(|tP1nsP?tra@T zlOx_U=0~s$`Zq5nkokzsnGNr*Ac6AG#l=M*9v*H;OiVPf`rmMQsI07vpvX!^MFnXp zD=Y65=O1>LkUHW)J@AeWVUulaY+{|Ao%Nxip$2{*o6^(MZ&=sw_*d{&(V~z6ix_AC hvo84bj|N1+_4{uzPyUFAj`;N#uh^d=etzCdfcXFb literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_scrollbar_bg.tga b/indra/newview/skins/darkgreen/textures/icn_scrollbar_bg.tga new file mode 100644 index 0000000000000000000000000000000000000000..cd484c61e8e774511beef0d8fc46f6a0745a1856 GIT binary patch literal 380 zcmZvYJqm+B5JqRMLMo4t3naY6DzURN|3Fr>}*`vdXmpXW5{kX zym`YiyC2b-rsI-Jn-zJUNAauhNCKpk;;8F779bc0rLJq%TJysg!wv`rlkrwrmK+Vk zzydVuJkL4m`Q1jl&5NbfdH d(`Ad#%+p1HQ@WSa)xQPjAUtmG`{3a3=m{%2!D#>h literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_scrollbar_thumb.tga b/indra/newview/skins/darkgreen/textures/icn_scrollbar_thumb.tga new file mode 100644 index 0000000000000000000000000000000000000000..b11b1bdcdd06cf4802aed001ecaf5cf558f47493 GIT binary patch literal 490 zcmZ9J&uW7}5XRj@OX;O~guXy~ -B2&IMoqtDapzD7>DdG#g%AqGV8A|eR}6O9lx z2_)XW`UzH&g`L^&w==stJBo6vw4V~3bDwcpmceyhFqbDGO;bq6aUj;~HF0wRDCBH5gNWm}!xVBdnLtEQ z)L{y#>pH|@vFPx8K8Msa4I&J~4pYeScnlE)L5C^iXf%RgQRgo)3h{~j#`iT_P%@{<1Eo)$000AWDH{L) literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_slide-highlight.tga b/indra/newview/skins/darkgreen/textures/icn_slide-highlight.tga new file mode 100644 index 0000000000000000000000000000000000000000..0747e3ceb5e7230c6e0644b05522f1cd01952698 GIT binary patch literal 261 zcmX|+OA5k342CnhDPAF6^a6T|3I#EPFN)w%Dojf+A!t2;3&Dlw5MAruwJziQgY7`V zmoE<(q5-upp@@>Gc^=mEPy3wA>$o8wRn5%mIA$$DhB;PL!S_JWUB5HfbvQ!rYfYuK zqLo;y1ajh2pc3TZ`XZv%2Mi{|kO9Gls)rf$!x0=dpWBIiRJ&qZXdnmGd>uii2*;Fmr2tUS(akR z@(gyK=LUG$T!uM8_w^o!=76DYYS_(PV}KX$w!KFyTSzG(A5=U_ z1HO27eTVL;$Ji?|-1a~}$mqI9!gQv4`bo9u(k6rm`s&U^Z?5IXLuW5E&@z(wE0y!P T+1#$T#dT4N)7?dJxsKR3(>v&N literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_speaker-muted_dark.tga b/indra/newview/skins/darkgreen/textures/icn_speaker-muted_dark.tga new file mode 100644 index 0000000000000000000000000000000000000000..f53e8ccf3cbec644f574088aeb420b5b80602535 GIT binary patch literal 710 zcmZ`%OKJi^5N%B&;v#s22$DOuf=WJJQ7ctw~#guxGY?=*+jqJ$6~SgjfGAm5^#mXVKf>I zv|24xt5r;=QyUvSzkCPds#C@t4u=Ab$K#@PsZ@f4R(dtT&RVU8{eF*pK7X(XlS$O; zb;M#Z(K?sQ!EIGYV!2!fbvBy?WiS}XTj-O?1gwP#Q|n5l0{3V%k{^>s;V*g5WHR#R zUFfUTN^(yolcF_axR=YNO=o^TLomKgXQ#*GF;c0NXx(nN;jsFDD7#Q7NPuFocqp4) zgHET@a77{!FxS~^hHkfu&1UmQhmXhiX>GuKKF4;uwFxrn?`fGshbBsLWeEuCJSB^KY$Q;S|L1m5yeeK z)D;xO#qbt=f=<)?CU-Tf2lMC6%a3> zJv$}0!^#~l z0Fs%@jOh-Ea^?E%Cw=7GfSuU4JhZSBXRD$PS zrkkY>`7CghR;^Yko6U+eOQjO&uyV*c{F?7COZXm3PvFDhknlrP4r$u9O}nsez!Ck1 z&d66k1U#KirTlz8FVe&dI;VG%rx&ry#987bd2nSUj$?=F3nCjriMG{E5uOW&4he>0;OlF`BcUc-WV2bEo}PmD!a#T?-1#oSxXU0M3%>*egF)nSIn3vC zgu`Jt91bX@s3vqg`6j_Ql<-5i@cDcw7K>=LS}2uDm`k^R3WKgfy(d~9otJQFJcBa*ei#YK6{o05APN!4rH`->iiP2~TUg^QilgR{HtEjyi z2n68qc=m*|*$n-DADvD|FS$~wY=oaEyz;Mzdm0Xh==FM9RIOJ3D`FG$R<=dVG#-x; zkH-;<#lZFHmF_0Iv9IM8+wC@1s};`A&!K3b*wS4gyAE!Tbr}o>P>aO^ic%9xvz;M( zrBZOYT+}9YBbk@O$KlP`Y&JxrQ4|UVDAxCYcZoy-R;!hoiBQ#}cRAA)bt2EIR6(xKX zguxKzKoQIoVXy}ugc%`}{9p_!S4oirshz&(t})n!&-tBu&$;K`bME;Gaao*>2{9pV zj=!0jniA)PiZvz8h8HXZPm`=E9*-w!u~-O`ub=_$gG*o}4k5-Ez5`ns$gujg_(T3cH?z+R3jjz6Z}QK;!sXMFB$x$QMH*-MJ-s&jwQ+4S^}d*pm$V!Y&CgN%&e&P=KPMBG_y;w6?Y)D=Q1x z+1Ygte}m!~;OP9SM~eEb&KYPG_{2@@T8y+9=SU0ucU z@-mi|mabWeQC3%1SIlK!U!T_U8z&P>>Xm0e zlG$v&@)^$+CnqN{H8pkZ=TVe3JUo1hb$NM-NF;)@vojnW9qHLlOiaMz@#q=2naJ{l zv_|X^UH2x3RrLG)n46o!>FFtWrZY1$SXfxV?(VKuiH>eoJl4xf<9W8Uw5VTKNl6Kk z^Yim{{hJlv+uOtT_O|j?R#p%Whc!c4>a4xJ9W^yIsH&<$XJ;n@fq?b`f6L0sKs0y2 zim`G-Lqk|xT-2W68FEf(@f^{E!{N|wsb<3`@T^#0_FipmEt!AG)VD3Jyu4gzVw5Bq z8KO5LHqmd9=J7;FM@Qiz)kSJte}BKWbx%)^*89o_%WpiE@LXgU4Tz~@pU~NO;F?%(V*Tz0duS_R;*# P{5I#ME!}KQdu99sg?yK2 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_toolbar_map.tga b/indra/newview/skins/darkgreen/textures/icn_toolbar_map.tga new file mode 100644 index 0000000000000000000000000000000000000000..a100f578423ae2e769cff7e5bd366c5ebfbadc94 GIT binary patch literal 904 zcmaKrJ8J?#6on^hVM5Yd<_{$Q!pDLSNQ{V$g`L=lg`{&Mh@z;3s2~UyB8Xz4_`psr zM6k3F#n#flaN?O@vYMEIot-^%=ey_5%nETMj?E-Y;@()YTCL)&OH$Jvy4S-4zSC5` zWlDlmr?Q38;ju`W0pgufoTDpt{L16dCnPi`O(_=oB9`4ErCk;!CGEEc7MUayBvr-N3jC3%TN0uF~m!}NN+r%a>P zCu5nJ%znR*Znul=b_`>2x}k zm8eXuXEaw`W-=qA#^W(2lL;1!1$Mg~R;!gfm!nU+-40bzl&{@nZ6{2DT>LMw_H*RmP#$>u-8{doeyfj#Mgzot+(Ivsp|{O@V%% zGcL>wKg|bad=`u4DG&%C6bhlgzaMV58|ic!)6>(4L?T#OSrG`vG5!xT$xl<;K`$ej zZ8DkA-Q5j`!-1uxB}|Tvj^b@J8kN&pz9YockILvsh~${d_`$(J3=a?E>gozxTU*HG za^h#q+S(e3#Jg&R=z?`5H_IbukH>?dp&^O(`~B$Y>A~#mte_^7No;Oz;`H^YPG`YbRv;R5UJWgdZZ?-a(;eZ^r3FdrgmIx zy4ULkIjpX(${GJ=2Nlv|14%ehX|g7#zP>)Gf+)AQx7gd;6C~9$x`eOUY?cnZ;3O)| z%*;s7eLf#pE!Xw+HI9#uh41$Ew)n@!#srB|#@H7+Ne@{w>t9${5R_`Qild_=oSd8> zpU;c$;NU*s*|~5-JBP$hldB@Q!bZLsZ?-wc7{TsAe=Z6yp>wMm@7Uh znedU3k*7M!`T4nI7mGz)US3KU*4NkJr`&I-zuj);o%|f?(R@3l>~$m z?eFh{1@Vj+s+i^@Yd&qG(Rjm2V<@Y*zrV-D#RWDtHo!SG7!1v){huF@SD&By2kPgK VU+urU3|-&#pN(I;zO{eR{sGh?iLn3x literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_toolbar_radar.tga b/indra/newview/skins/darkgreen/textures/icn_toolbar_radar.tga new file mode 100644 index 0000000000000000000000000000000000000000..d1a55ed74ff21c97fa7e918843e951c6a633ce45 GIT binary patch literal 2348 zcmeHJUr19?7(cY>l!3RWntzs=tOr*UwuO5zOT+AfZA&WxWp0k%bc$}6YfKZ@${~(v z;G-gw*^48#Km*4l{{F+TYM{1v)zJfWt8YD=VuI z4zGjL>4L5<9%^gric+bxZhwDYFvsEHA?cP?RdLDg?)%{NPQljJHtg&q!0&$rCX*RZ z|GZfJ)CU_I8w~Z`XlXJ0^m?Zu7K_mw=VR#g;Owlg*xGs%RI01Up$Dy2cQQ6NHv?*L zEG{mJ!aq7Xq8ua~$9*;!4A9ng3y6oJy}cb23Pl>%D-I40MB%5?X*y>OYW`t1KLDyH z3aTOW?HJd3mzS4CVUs^IGc&BRvT~}guOF;d8(1t>7#OgE-ToAsnwpL!5{Z-Qpi~n= z$FZ?7hTa5Su8EW08XtGU#KbeO*#j>k*iqegQaVM9hmAJ(%Ar zjzP**s6VtHb+X3B#yH&()MIM3dYk8Yme1$e=H@1|*=&rk_xAQg;m2Yz%Ha~$%_s5( z-&>>6s3@${@>^P3A`TVynuYG})ApTZKAX+5wY9ZBf_)ZUf8*QI-_XOJN1c!PUfyK9 M{^Ty--Kk-}0mhiqHvj+t literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/icn_toolbar_search.tga b/indra/newview/skins/darkgreen/textures/icn_toolbar_search.tga new file mode 100644 index 0000000000000000000000000000000000000000..2da9704f1b30d6d78c55356d7ab10eaa678a0c10 GIT binary patch literal 792 zcmZuv-HTFD5I^+A;$N_j{R8!`h;LUAqM%GdR{RS@!EZFoRl5o6r4O&)YbXc`iiY7w z_!O}{h~`QZ2KulYvNs_mE|_g_nz<#5+YZcc&N*{_GiPQFAu_U-ZL&?SZ^h+uIXMTH z;7nu~hJsB-@xtXop|Ffbqg1QaN~bUI^omNQ+OO4WOP=ScPN$PR&(U)gVeO5_<5aKL zQ-wm2dWH`F204*PP=moBxu2qE7eTgWr&1|uG#W8BI*vh4Kyg0+9&pv=)HaLF=y7L4XK?E59MyD*xj$5tPLATrOj7Fo6-#~tX zwA*c@bwQOZz!~k>YPC{`I)EmynM{VOR;!JEzdsZNVYUKECX+}_Z_-XUj$4F6p#!(u zZFvY14u|<-vG{5@9DZIb7C*qA0`1EtjaDj^mECUtWU*L+P~#(q!x4-`B8g6?^L9F& z3Zf`Vb#KxJ*=&{u0)g*9YnV)?J+Qmbn!R$l{CYB(9KnNs{hy6})o#bU7wYEwd_p2y>%(2i5T-!Ir~wnM1(eZ5{EL5)bk+5PQg2v%eZ zU-7mbay1Mkg!_nv#+{diZ1cVhD$hy(Fq|M%hHq1f4M zmM&_oy0y%LwSgLQt%+V+f>3z6y1GKP+wJ1ISS-R$snu$MYMLcbSdy7FO%r>KMgxXn zARG?E<#Hhy4C3PA0@Q1FcXyE3XL{V;-a;D;1`rPq4=|R?C6s!-j?>dq=pK&;io@YR zCX<0i0KKvG9*@V+7K;T0C1bT(L8(+KppPC11fY1mUPPnOHR`4Ja5#iEolYShA0J`B z`u2E})9FOHTt+&b#>vSEd_Er{kq9)xb|RR~W@|kq$?=xCy4`N*x-Ro02RUzUZg>Ys z^PfoG(^jokW!=us&Lp0>rBW%Vs*2;|W62c?g}`2DL~LV{l8nOE>2#1tBoK?mo=~sI z!`PT3W4XV-hyK$4H9OgEx52XXdOb`g6U^uHC!8#nCd=0E_hDzsqtOWYe4YuJ&yOLh z@hI)=3BgoQ3&GN8d`zNHC_uZsyo8;pSw{I9t^d>eBV4@sOD##(XJ%@WSawBcD9YxZ zUv$iJvs;_2cP^JhJRXO}LfVqaB0M;7_2?})$ S^9=U%_tTAV^Yn4mV*mi%|K(Kx literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/minimize.tga b/indra/newview/skins/darkgreen/textures/minimize.tga new file mode 100644 index 0000000000000000000000000000000000000000..35d2e9ada7c536ad03bbcd55d0c913c75e5452cd GIT binary patch literal 476 zcmZ9JyK00$7=;~dLaKd)yg<@hrP>f7B#;|-ib-CPO7Fdo;{%5?*$mWI$|Sq3@JGX#l-8sj)Z7DWL; zqS3kaeUCIv;W!QsmSsUF(eOmY+O|a)hG62bEDLlJ4Np|8X&MAU@Dt;(#b`LFSY6lf zeIK@M|6WR>;R$2gFIQCs>3JRmN$IjIAzjynASr!1ogkwqf*>i~bsc0J#}K5yI!Tg$ zdKd;s_9jRwy_J{e`K7$A^R4P>npD*-_5Hez>S2yF=hu6G{n&q+Z|2MM?bn0(w7=87 E0ZM!fLI3~& literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/minimize_inactive.tga b/indra/newview/skins/darkgreen/textures/minimize_inactive.tga new file mode 100644 index 0000000000000000000000000000000000000000..8f09acda957317659835123d6680adb47fc94412 GIT binary patch literal 194 zcmZQz;9`IQ0R{mE1rCP)|Nk>|o;-Q-e+!7!4PrIZmW5_zKgc#T0_Mh$pitK^&tOk~ NKivp7Paju31^~b_av}f# literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/minimize_pressed.tga b/indra/newview/skins/darkgreen/textures/minimize_pressed.tga new file mode 100644 index 0000000000000000000000000000000000000000..bc03952e7d2d5ee37ceec655ecbfced92018adeb GIT binary patch literal 380 zcmZXQO$viR429#abmb9xf%XbrSt^tY{i6r)BI3eDnX8D`@E!vSBBFwbi0Ncfb)Z>< z_q_>8CIDNQ!v-668_W0oa~Ou%M&L zN*;);}Qr1TyvX>C@3*#Z6$vKtH*(wzggeO8;&H68~9%#9tu(2E?B> zZ{FPY_wQfkUXa>Gu!c{cK8e@W)jb4CfA0hmU}wArnSA2Ji3EhgevllP3-)6>h>P$I y!>?bzIMBs_0Vy!l#J+$3&WmvKd{7XPM8FbTNKmM2m}ju3zn^Y|o2QSf9s>ZyYKSZV literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/move_backward_out.tga b/indra/newview/skins/darkgreen/textures/move_backward_out.tga new file mode 100644 index 0000000000000000000000000000000000000000..1acce4b7b1a14bbd63a04758ecaa3ab9d3ad48bf GIT binary patch literal 769 zcmZQz;9`IQ1qLAGnE(I(e})ba!F1!s4d-3Ec2)lS_m6QhNTeM^Fn{~@jlZR(B92qB4pCGn7;P}eZeU{8NP-3T{NA6GpF09nnn-~a#s literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/move_down_in.tga b/indra/newview/skins/darkgreen/textures/move_down_in.tga new file mode 100644 index 0000000000000000000000000000000000000000..904e9a8c8231fcc7a06dde22e16a688954ed76a9 GIT binary patch literal 703 zcmZQz;9`IQ1qLAGnE(I(e};At!SwInKgM0Vc2(ZEal?5ET$uUXxpQH8d3pa^T3T*? z`}U20GDxZwM6dyMFm2zyy}qQRTN6D<~-V1XTA8i2t_1H2iLD zZM_ckwM!pd1Jj8UCla8hzwQJp1oFPu)zv-x^y!m$FI*vWd3ia=@4tZ<7PG literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/move_down_out.tga b/indra/newview/skins/darkgreen/textures/move_down_out.tga new file mode 100644 index 0000000000000000000000000000000000000000..39bcda4c3719d0fcccecf27b56befb17610be590 GIT binary patch literal 843 zcmZQz;9`IQ1qLAGnE(I(e};At!SwInKgM0Vc2(ZEal?5ET$uUXxpQH8d3pa^T3T*? z`}U20GDxZwM6dyMFm2zyy}qQR5zHVHw{G3qTwGlIJ|H0Ab0bJCi>aw8 zSQF6v9~~VXmv7#@=`;bM>GbK-(IE4~!^1xr8yo*?LeT`WskyoN4$vl{evqa{5W({I z?_cK4n>V)=6cl{&@$vZv)bqCuq>%~e%-^l8t=EC!;L-=zz;xooi3E@>DJdzhJHZNp zyzg~&bq_y%`Xt^9SIAagUj7a!^}DdJ@H5c#uerIoVAq3u(G1ea0ulkrd9FjS33m8ExV5ABl%t6>rvLveW(2NB+p%vsd23(Fo_bte6;HYE(g&a5~km{s% okdqj`fB()4_TYR_B#}hGGD}EMsB4&Ku&2MDZiJhskE({SB{RqYX{{3Uxx^-(aP|bTF{tRM(P5#l*(Q*0a&6`dL zKQo;9OlJ9jQDFE8&u(1e@7B*8x!F2w{ifpOQaU6nw;IZpuz&nJa|CCiYYP}eZeU{8NP M-3T{NA6GpF06~(Ts{jB1 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/move_forward_out.tga b/indra/newview/skins/darkgreen/textures/move_forward_out.tga new file mode 100644 index 0000000000000000000000000000000000000000..643c260667251729c581c74998848f1246c927ea GIT binary patch literal 869 zcmZQz;9`IQ1qLAGnE(I(e+Dqo3SzbA=H~uq`2PJn?*tGREXDv5Yc(@7`_Bksef#!J z08O$9B*|cEYWlwspEA5=&{>iRK?GZQ zdHK8i{QTdAg@vCB3JShrxQ_)S0+jh&TwMGG#BOhIzt{^mfa%1E6A3^A{->m*yzT^f zhzZF1URPK5@YAPH;s}K-fB*hv-n@Bp8_=vzK0ZF*fNKA?fi*-#MEq`TZM}Zu#toM~ zkjc#;g8B66)6pQ4!^6Wr85lq?rh-Hu!kag5Zp+Wl|DT(i z`yVXa0+M6-_wOIm>C>m93knK80i|A}N;7TUy0saq>supSt_h@-8Km{hnKO~a#l`P| zQlI)j@|_?lusqZD?c3|2dOw5pG5{6)>w&9c0VxF5o&F1y$lq?rh-Hu!kag5Zp+Wl|DT(i z`yVXa0+M6-_wOIm>C>m93knK8rKF_1Mw8yUb!#(7myeInH#0LcgzhGgZf20~GiT03 z78e)44-XIj)Cf}312Ur%Bo9`^w0-;bdXO0b0Rf-E3K-1I&Hr_Slrq4TvVhbBjbl7_ z?p#<&Ny)p2h=@Sy?|)!m;O7ab@~j~F8#it^x3sj} zjE;`}36chx(}$|A5u}dg+qZB0ot>Q*larJGz!dhPDg^t4<@W8{4nPxc0Zse?Q`m#5 zuo+|`)7P(G1v@%AE`v-&3lm7N-@JL#skyoN4$zmsK?Z=rp#!9~5$G5JhVS3M^MXUL z6(q(CG)}0swe>nM6u-kG2okM8PrB6A)jfm@w}W&re){xDyuH2sA~>e!gM=t1V5u%7 VDAYB~GuYGLPdCEN)5leh0RTE%b@u=O literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/move_right_in.tga b/indra/newview/skins/darkgreen/textures/move_right_in.tga new file mode 100644 index 0000000000000000000000000000000000000000..c85c4c33584d8fea19693e5dc754b590e35589b7 GIT binary patch literal 598 zcmZQz;9`IQ1qLAGnE(I(e+Dqo3t}TH;r#sk|C={&ZbJyO zfK&tVYasq~`t<4OfB*h5^}uyCf}}wvegkRUx^-(aSgsMI04&!5l>5s7B>sT8Amjc5 z@h2dDf9A}YNRV+|VAUX^A1Dkq?lZ`^?c2B4BjhH4;mE)1xbu>-DmB3y4? zUf%y*yLMG#k^9-w(sJ|0jT_DgIk34PFZ}83?7aBx+c*ABxS4SG`~d2^b^G>h2ZVe2 zVD|m#=;*lo_3Kx`Zn!>%@87@kb^y&1VEgs!7Y9fjsQNQV2N3^mZf?GF^X5$_L^y){ z^#zE(x3;!k2bv`WjuS-0)Ya8J1UlOV5iyMI?d=yoeflKc4>El|RR~zR2?+{y4f724 P^!L+^aP#zW)nfnv;yh*d literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/move_right_out.tga b/indra/newview/skins/darkgreen/textures/move_right_out.tga new file mode 100644 index 0000000000000000000000000000000000000000..729331d99ae98e0517668abf0a33ff9e1cd9a6b6 GIT binary patch literal 674 zcmZQz;9`IQ1qLAGnE(I(e+Dqo3t}TH;r#sk|C={&ZbJyO zfK;cXq`WRDDEM^x^y%n-|Nb%cz;%J8&CJaH`}p{L1L@wnb!#(Nx)G#?5u`gKBjbNZ zdV2a__RP%8KOhm11|a?$9v=RwxVZTJnKNf1LFRUW^nf*j9SKrqZf^d+2gG0s2nhHL zvSIu7?ez$S3?TFRK?;~7A|gJOl$5+XckWym&@{#lxM^TT6Tqef1_pl4%gg(}YuBzy zGzEPi1uUkfreOC)M@Ro`X=%B6oA?80 z;;q}aZ#y77&;#;7BiL;qlR7#&E`R;{Rj?aj()aJ*c{_ln3$XqA^@{@}4vdS>ARRy- z|88z>zH{^DO(#U0Fav}13oxXEl|RR~xb3<(N#4f724^!L+^aP#zW)nfnvvsQmC literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/move_turn_left_in.tga b/indra/newview/skins/darkgreen/textures/move_turn_left_in.tga new file mode 100644 index 0000000000000000000000000000000000000000..970b7f2eca43a17399cdb583f4f5cba2b3de660b GIT binary patch literal 1032 zcma)5O^cFI6n^z}#;IS>vQ5j1XdOghU_?<((W;1|K>PwR33V}}IhG%(^8@A&xDr*0R&bj9v1>v+X|C|-*ySAfgn!qNG zmCk0fX%2@&*(4+DX(tgB!ZZv&leR!QaT|hHu-olRl>az;hwy@`s)kLh7K&Nkx9lyK z%g+MGc)1o`u~>ZJa=G@7V{AdCC&o(@h6EMhTEnSFj>X38?9a zURmpOI@h@S8+@thbgHY@>+5c}8`-#~FfBBZ45}OZe7>)xQt5dFd=`nBOeTa_I zAvnYi6?MDatI>tP&~CS{$6~Q6+=M-X%5RP=C~fTb`-hcEh*e8cuu(`#(uwlIgv;d$<5W%@4N+&?4w1pE*K1UYPH(q_sGT% zb4r$FV>BB5ME?1`G`u0TeK#Bqe@Um)+mp%UOac-fh}FSha4D5aeIyBTO)M6R+H5v& z(pZZr(0IahilVI0Xh7@+YT`VjtxER8-P%kYlIly8x z8V~F0>IA_A!%CoUGMNtB+uQdI2E&=vYEAa`_R3V9NhXswnZym<;`R0QXAXzshs9z! zX=rE=H8nM&ySw|8uB?+pgsAyUtcdeJ3G@@nRq<@fCuJ8M@9L3Ua_{erXLv@IUqN#>T!zA`z<>Kt`+Q=jW$D+R@Q*K(%SqPXVb$1bO02qsi^<5r{OP$GNO1)n1XYxq2wzi7$^77xk zIx%XsMxzmgJ|f->WOsIU?(tj2mR;N3-PHtx!7#b}Q>)d&oE$lo*X#91I-Tx>t}M+a z>vp^2u~^Lb9>P4jE7@$e#OL#U!jeE32gHmX~ul z94EP4?!)I<3?2)@dVuvYqOn*imD;6LltnO^ObRfEfU|5iyAjry`hLHE+itf@X0sV7 zeZV>35HLVt64-{Din#_rRWq5)W(XCiKz*rHdgF4r{-6se82uL@0!{%k1}hw%0B4#M z`i`pA>a!q9Q5wG4Y(BEtY$!9@2Q$r?PN%o_k?2Lk=kxjZZnyh4a0Wya;B@MAI>kz* zvObwiI6v}eCHPjW_3-L(qX4QRc?1wKS2CIO5!pw|#bWWT$K&aNdqCTxgA;b<1TYGR z!=*-}@t6YkFhFRx+YhePC7>Kr5El#ve@c=xA3zSVxpKMu+UxZ;u>-Om40hlcFaeAK zSoTFU8qIY&o%>WQMeA^-6N$tZzu*508hwbP+Ce@S3Wa{ivaF{Tl9_{b6Kb{E@;@WL zh{xmKyWQ?R8X6gfou*N6P*Qn39^asyAg55T*A1v2i^ab6dcC`}SmfeyV39~9j}f$$ e2Uy@tbNz>1UwdJAX?$*6eY*7OiE+hnhg|}n>^|54 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/move_turn_right_out.tga b/indra/newview/skins/darkgreen/textures/move_turn_right_out.tga new file mode 100644 index 0000000000000000000000000000000000000000..3105adb7b09503e987463e4a7d47baa7334e927f GIT binary patch literal 1127 zcmbVM-D^@|7(aS!uKEYM=%Sl0D5;-@w@Z)%TpC_~r8dOK#hxhROe!u7QNKt2~@pFM9zv)$$ zWhoyRs@-m%58$oS>708#afGZ^EBoV>nxCI%145yYrEE6a&kmEx^luI>FhEHl5U?wM zko;f3Gc1E)7+!Kx#tB+02;JD&FeLs8%5gfKhxvTo^zv7@SSVq^Po?JVvbKJ zoVB&J6|>pQ`mt&NA)H=ZTx4`QU57+D%H?uTViO9#)oNX|+wFae#ljek#+Fj4JXWbx zds?k_A0nUtj|gB(H5$!6L9^Lx))fU2>W@ZM(3-D`b6vBf+!etzNeSQ7u z3n2Kx(1k+5=<#?yLdpOOOa@PrqPxq>%k8bLEyZXw;)H>K>&V;P-Ms<%5=akNKnlTy zCbynit!_gSnM@{#q#!VPo12?Duh-ioBn$;4+*%%CG7^d85VDTNV#P|Oatnze%&}Ih zU59AI-JhMEJqSW1F6j>&iA3J_`~B(XfJ4UFQmLfz`~6kYpn+U2htpLk6bED*Mk0}D z2wc+EuZct=U$57%VK0z>8a}dgI{hjf4u2pM*@Lk{l0bodh(@FD27>_~`;BIbEHu5n zy?qCkL?)AUKsl94y=^oaS8>K@C>V64t&XE@=deZyn;K4 pE-p+r9*-A*f!nAlZiBi2-{de#sjefI^BrP-e13daiF;#?6gLZbD7J_%ijS#`5TBo1M$~( zkdK+6ye}Y5dwcuEUXWU_2Bs4yP9)^#=l=&vz3v3bGXaV3b#-+QKYjWnj!?+*_wQfk z&6_v30i{0y@i!p;3*vw^{BCV+y?*1y4VONU$<1J=oIZUz8fr2~!@m}o;y=yJ&3C?j z{VLRtQ2g)TKc=l)w>AUSya(dXAO_gv9~~VXmv7#@>4fkz)0s18B4H*s!W8~#X=%9y zG*u80QEVVnw{PEG4^#sR6;O!$?Ck8kc>DHkhe;sI+rch9ckWzRUS8gRpb0mD(aJv= sF2w{ifpOQaU6nw;IZpuz&nJa|CD4$dP}eZeU{8NP-3T{NA6GpF04#;3&Hw-a literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/move_up_out.tga b/indra/newview/skins/darkgreen/textures/move_up_out.tga new file mode 100644 index 0000000000000000000000000000000000000000..777b221f80b450179201b6e46e9240341da42df5 GIT binary patch literal 843 zcmZQz;9`IQ1qLAGnE(I(e+Dqo3SzZSnlx!Y!}sssc_)ClU@?Z=+}!`IW@cvp89}UX z-@XZ;Nj8Bb8B9%0|2N`O1~vn1+C+rm`}glJXkEU1c>x26g(LxTNoz(%#(qW+3yZCI zokW%-JID!V&z^Mvxd)xb>%3pTesQ1$3Yu>lL0)DnFE4+WpP&D`u(0rRK|#S+P=JDh z3>0?FAO;Ia1Ss>lxVZQWh~3`aez6y%7i<92i4!LhfCl_eNlAI#3DUp>AS^`#vBb;4?V> z;hLhOqknXCbX>l9^QIFbblA_FITH!83FwedhK7c4^IKY4ZUM~~L?i+>konuUZ?7*Y zDR~zd82A}z;?K^`&WpEi-*%V;az;DY?dQ&&3(L#P`wukXCNQP&Plih|0Zm}swQE-; i(6`Q0K*IA$Az+y$Bq-E1%rn^2-%mHf&C|zKj{yJ$hTW6^ literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/mute_icon.tga b/indra/newview/skins/darkgreen/textures/mute_icon.tga new file mode 100644 index 0000000000000000000000000000000000000000..879b9e6188bfc01fc538a3f8f7d72b2d64e790b0 GIT binary patch literal 1042 zcmdtfA&UY*6u|MpWEAAerEOv|`2{TZ0R)4{77>Gpcw7`&lSyo15W#3Oh(Q#QYt3~)k#dp&C8&yXI`I*-^AEk{mjGgzR95r&AqPnp;!TzBz_e_6Q+^C@1SXOTTN zXj(DNeGrrLrL0_^x%@kgNiX@Y0d$>?J~7$G(=)j BCEEZ1 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/notify_next.png b/indra/newview/skins/darkgreen/textures/notify_next.png new file mode 100644 index 0000000000000000000000000000000000000000..b57c26e2658abd4cb88172960a4bed7a29151733 GIT binary patch literal 3360 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 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/progress_fill.tga b/indra/newview/skins/darkgreen/textures/progress_fill.tga new file mode 100644 index 0000000000000000000000000000000000000000..bbdf5dd0b0da713f1f27f3131d8c4f0e57842567 GIT binary patch literal 896 zcmZ{j+fG_R6o%JmY7bX^guX!g7B(Si+SnG;5ThXwqFxCX-pIk(fC$P-l#>U<3)m`L zun|q4!g$f=`8)sY+KVRL$v;{1t+i&YIc$+P^878!TY2~DadUH1^6TsCqG`#-#)daB z11g3=3`5ykX7DuQR5ThDBhRhXYH+L7Du_H{wYIhX-SOm#AY}HiCS4%5hFaM(`j%961BRzDn`&O zzECI>u)n{LVzG!)sf2@r0~{V6qFgS+sZ=VMuzzbUkkQ8&#xjSwT*I#RI-AYHaU5u^ zvAesAOeOD8E-RRa1D0*Z(|NOrXrCDj70GX@s{-Y`8nj`;sUzY>%qCayoB!e`+G8_((9}EUiTU%Q&61Ba(Ek>TcySsxko6X?d-{0fs!^4AbS!TV3>2wMvcudmf mwnfa~J@VeIW!W$5`16Z>{~BCe4txuI`TYLJ$H1q>5AqvWwcx)1 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/progressbar_fill.tga b/indra/newview/skins/darkgreen/textures/progressbar_fill.tga new file mode 100644 index 0000000000000000000000000000000000000000..7070343c0e048b2d1323036eb84fa6ba54e57946 GIT binary patch literal 773 zcma)4$%P7tV+o}EsokyNQv zWW&sIUn-SE%VaWgRYJseyWLQx(`nhHQYpDlCX=GYS z%)`;uw!`5tw(<<^F+9rRWNgPY91dkP8VQfbV|l>V6f%KBOsQ@zdGK{H0@sa3Ltv#? zEIzh$yWPY-pO2oS<#M@{#bP1z`COe0f>*1Rd|$8E22$LMr>fa(Ce!IuT_c<^{Ae(A zoy_a?5+@P~W6h`2NqE2COZjj($dBXkXdoS&zT53Y-)^^0ZXTJO&1Q)Tg~H!=bRNUP rxm=F)d_GS<&-YJNB>__0KLeL%{`Ir%)^7e{{`B$fxA*1`x9{i=f-Zbf literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/progressbar_track.tga b/indra/newview/skins/darkgreen/textures/progressbar_track.tga new file mode 100644 index 0000000000000000000000000000000000000000..3434330c149e0a56138d0471a5654774fd8cb922 GIT binary patch literal 486 zcmaKpKWl?P9ERnxln(t2{Q~VSnNtu-3;jpw7fe8LkSt;lApsXr%TLh7Ah;L^*#hG7 z)>opCr3ZIB_dJ})ou=Jt-xN(Nk3cZmorU!F>`LB{eBM)Y1- z?z(OeQkEqY6AjCdPp1>IEQ92E4n?Aw^5Jkm6h)9ENuWqHQ?Bb8yWI{Fh9MM*X3AAn zAqWDz!Tznbt P#_P+&_mlCwc+~y?a26mM literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/ptt_lock_off.tga b/indra/newview/skins/darkgreen/textures/ptt_lock_off.tga new file mode 100644 index 0000000000000000000000000000000000000000..cb683446928d2ac8168cd70bd1183a28bef781f1 GIT binary patch literal 670 zcmZXSIcowz0EK7BLL`+xA%7t0tx_2fLISzSzlq0eB>`Vm%N?bX|l!49x{y?Kt~fZ3 zgHES|QmF(xm&-v=Wob!f23#x_Xt&!SWAFES2&ybC$;^PW*$k~#OM~0(HUw!&W(J&2 zr)V~t8eFYbAxKLyGvIhUMx)WtpyzoZNJ}y!XmN-@r4%NU2^6oY&-owbLfvi`l}ZJ+ zZ6nM3T=)C^V4rfiY-UoVxkd0Vecy-b^?Hc0b2^=Z1tQIvAt_T?E|*YTTrxhN&&W_% zR1}QJn8JF!h8he8x^TH%kg3&bu&7vIM8*_$yB*YUIE1WLt0)u-$l&j@2-9Ii#uN^R z1MJag1W~Wo^>MVKCz%>_v)LejJRTvbXp3U87(Owo=>5IFek4CrZ>g8(yRXO8Q}SN? E0tf7pUH||9 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/ptt_lock_on.tga b/indra/newview/skins/darkgreen/textures/ptt_lock_on.tga new file mode 100644 index 0000000000000000000000000000000000000000..5a7413bde582bad60de5bef238563afdacac4035 GIT binary patch literal 1068 zcmbW%u}cC`90%~H1r{MmHPj%flS@)VP&62k)`=!%iPjWBgpgPflu$O5mXUcVw&ajh zBw-OX1yPFxwb)QYK@|QWzxX})9ao$~9(;L^_xpa{-E@qp89h3tV}`oyg54VGWszz^ zmd#|Ln$SB{bI0(J=;yf(nBc&pRSeFkhladnJ`ZoP9-ho-J+MSsF*u_h8uHquOL*Dn z*P+TY*WT5uYF*7Nl&u z8o^U2L)6s-w8vH6K|{VfQ-Z54zm&MUg?n7(dwB;9`M$$fxJw75Bs{I$uZ6sT!EeDc zc?S*of!sSh9)+cxEf2!(bQgDMMV}t{Tu#M4pHE`|_4|DVD%5Cg>n5Ac zhS>dn&uzC`v0AO(GMNk+jYb5Y&u78{0tPC(-A<%SbNY#}-EK$BdcEe`?Y06Eipj_I zdL_W>Ca7#S8(ufCPNx&OTrRX+E~R8LsZJ&n@=13lCP2U}77NMH`u%_jCHMQCU=Xu_06--e462<@$2bTsm&=H0Hk&+6sH9RUJ!Kp8?Bnqu&?8{!ROC5px$Ac$abSe%7giOm_oLLr4B{wTDt zJP=z25fwzSveqlb>RM66$<7*IZee%7%*X0zeQ z=E;_1awuq#ek>e~DPo{uy>nR zGclXZ9-`4GG@DJ3x7#hSsL+C*`Ft*t)Es5#VVF!Ne6d(mF@$LN-0$~*RtlkKI-T;r z06QEGrBEoObvhkbEEdr1c0op(MTHjhV8mcBkaS?b-&gE*`-MD}Lcw4VWV6`}EGmT2 zgAu)6Ptk$(dR?*EZ2!SPAn*gCdVp4|^-`=B@py#O=>*s7mEKrd^pUOR^Lbr?jJaHnOQljG z$$B7VfYE3K=kpnEw;SwsJ4mO~;B-0O;@);TEYHNmks|OupHK37y^6=&k??qyTELhSWVoI9|+`qr6)1=ui1 zF2r8%#EwN1yU_Koo7U15Y^QtT{GpxIH%{&=xN&MfDh7&ypzIn0W(e?8v7$gRgOZ2kbx3Ikk!~L`BGBt~$JT_&5!tcPYrgzUD7rcG` z2#i5&kQhiVKf-O(jGA~n#Ns?Gb~I#$ z1@)ICV#FUPJZe&dgov_qrwZQ(7t}fiQ>-5(CMB)EwEkC>&k??qyTELhSWV zoI9|+`qr6)1^smelj?F}=YcSY4H5&%h1lzz*s*A07rOp+(^|TM?Q~C^KeV&@#>ssJ zeYN?MYO`bKfiQ>-5(CKv+v=WJH?0l1ucm+_$j32*dre>M}KpqC7Tbg2L~>uBLa-9~ZoR{s@dgY>*g8E+kck)I0&g!FGE4Vm&N2k1ghak4{^~<4Rj1o@^k1) t^tJB-(&1@A&YF3V9$4*#=^Y3fRvLr^g}R1$27CJZ=|;GD`nc*b005|8n704` literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/resize_handle_bottom_right_blue.tga b/indra/newview/skins/darkgreen/textures/resize_handle_bottom_right_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..b40ef7305cbaa9518775193ded040e6fbb870bfd GIT binary patch literal 305 zcmZQz;9`IQ0R{mE1&;o(urLNRq8TK{3MBpmaRZ2h%x(m6z)D&`Qf$a_=xngER**6l zbSWUe0c=1UPHC|2c91kPx^A#k2S|z$CIvRE6GaHDstY6p_5qlS=2tKm79=4-p{`+` Q!Jhtpx)E-kKCXHU0PZhffB*mh literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/restore.tga b/indra/newview/skins/darkgreen/textures/restore.tga new file mode 100644 index 0000000000000000000000000000000000000000..904797e7e6cfbb4fdcb46820bf46f3867b3d3e14 GIT binary patch literal 636 zcmY+C&1%9>5Jn>^l&*Y)zCgRrsw+zarG@^{_X)*?@1UD(T)A^8B!m!&uONs7;y(nl z2?%4(Xd(u3`Euq=xXB&ExHrnHWweZkyP9d5uf?5oi$!=!AcQy!L+S4Kd#RBiVA*cB z(w$DHQX@g?EbH}Jf*_DyuO}Vbwxv#jP^q*eNn|`83r6Q~I7poYp@P<6iQ`yCqmgQ9 zn#w;`gG8W$f!SnPEEX~x4zGqAziGK#itD|o;-Q-e+!7!4PrIZmW5_zKgc#T0_Mh$pitK^&tOk~ NKivp7Paju31^~b_av}f# literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/restore_pressed.tga b/indra/newview/skins/darkgreen/textures/restore_pressed.tga new file mode 100644 index 0000000000000000000000000000000000000000..c8ce0f9b9fa2116b2c665a6a223a5fbc0ae2c732 GIT binary patch literal 564 zcmZXSL283g5QfLBLRUFLF3?;dtAq+Ag`^EVfERg4$)b1{7hb}92nr&if{2I{|Cwq< zT@3$x@Bj6^c@n+Q`0Qv$`>o|T&YSDH@$XRBf&!sIL|#=@EDD9avMi<5Vv3?*@_nBl zSQVvAS`?G#xtbq5Jo1)*rfrsG@>v-82Pq3m;#d=xTGKS;4Hia&yCMc;7DEc&5HVuSC>^?MmE=I|V_+g;-{^{f#e!$n2WZ zaWNSU>5F*pMPy|L(}Q3+O*bY!&!)5K?B+brldauu_iDS{&bhAt9oVdyyP?f|zu%WI zKO@|L&Dv&OK8K(Coc#z>ug_>R=R3bvG8^Rv_+3BBdGnn04dndm`xq_D`Hwd7`n);+ z`aVX>a{i-DygqNvzrK&rvYh{D6R*#k^RMq?v@GX8+QjSg=KSmX7%j{Bk2dl8ygC2+ zK1R!O{-aI2K5x#yzK_weVE#YK9h_P}JDw$4%LCs+eJ(t3mb2hM?}ax+^N0tYTx;MW z584`x`WfeW&C!+X?Ooc<7ys7lko^ARTY>Lx!6{m-%WAx?eelAm7mgn4ZN*yCim8qE z@)~>73!S{D_)cr4q6^Z!z4TVIdM$K)Q(Z(PKyh932Y z1GS&_@H)N-eI5HR#ijMpGf}IkK8<-E&%s9sM-6B^OF4_-OBl}oQ=x5rKBCXzL9hE- ze1^L4p_3~T_v)zk9%>DJtemgYe$>H5b$AptroZRN=?%ggYJ5t^AJs(9P}+y{|4?Yw zM~UGgZ24Mz)ME{I)%|%U-A7~ee~DM!pJ%o4N5B8y724MOBNA(l2W)9Ao;uKcctO>O zJyHjnuJ!PqqmS}%^g#274z_g9llS()qe$%Q$h}T(s4;%9$l?6o6#6pj?Ir!EdiVM* z)x3|~BhLa)4)%D}G^X}{VQcReZ_j1g;S>D*?`09zt`~n%yLQj4TQ{%P{B4HMkIQ0m zMfet4Jz5lNf7Pi0TiU65>OlG_qD8&X)NiqRBdy12PwhjD4zi!`Nv=LPtx;WLyyZCI z_rKA2qJF-Y&!bv6@3owThdo#2_BSh*Ld^sWBvue9HB_ zuS=hcPw@SZru~T7AM`x=TJ(K;eU^Hc`utv6r!hX|G&Y^wBem*LE{f@a=5zR^$b1iI z^S5_^^8K&sT82n?|EnA}-~Sw9;(rclv$vmpn>~wn0r{Pfczxdk*Z05q-vAyxczph3 S^Kf(j-mRy1Hh0f&Prm>sXZ7>| literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/rounded_square_soft.tga b/indra/newview/skins/darkgreen/textures/rounded_square_soft.tga new file mode 100644 index 0000000000000000000000000000000000000000..0e5bc79ac3c6e283cbc5ec60a753ffd96f376a3f GIT binary patch literal 16428 zcmeI)KWh|G6o&DQK@kzsCtA#2*IG>KO(78i1w)i7WQdGAs@o@R-zxk zKFy-Ng$RO(#`gyqOcNcu%;gL`>~3-=Fy}ct_s+~Y8I6vOy6xF$JQ|n?mz;9TG1r`T^S$$e-0=I&upM^7oA5Tg3-60T#eg&JIOLL3 zZaJO=&gX)4fw^HN$Pwf0^C9epY4{jE6@!WaXVbtTmz-_~j=AQXdvk&H!K2_j@j4jK z_vi2>d@TkU1MWEFl2dLu=9+Wv=fkzI9=3u!ku&!D7QTlc#UNwA9fw?U$}PuSbI!eM z#7VGLv|cc0OoQC9|IhHN7-S5%qIq&Z6Eatsy25Uy^26KmVzVAKvwGA@@ z+;PYyr`&SPHRlWaxVPiF-Zh?ezWJj3CkO-I4*KVmTaLNry!af5UQn99sGB5u}EPl>dh1_Bgci-y=v34=Mi*%k6P!<-bRe8Xi*q8Osum5`f(`FJJ^ncj%pL+h=?(^+F&wuBW`c?nYW{pdq`VTcgRsYpyja#4kud4rS zv$oZIKMm@>)c&dc+727xVEyM@KC1;*5409GgK;~-K5B;4ja2>juwuX&cN}ubDYqO? z0_WW80jU0u_WE1Yd8zf=3V-YW&;z6w$T~n@h}@|DucP1NrH1P;{-^(IHh-u3KilhX zbx+54`Ct8?GZ`ZXx?VtYf;FM@fosFAM!2gLtk*wvlSe%k+;PYyr`>$dHRm(ke*?IG W_rcP`<$KF_ZeLoxxxBJ;dGs5BaS|E; literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/scrollbutton_down_in_blue.tga b/indra/newview/skins/darkgreen/textures/scrollbutton_down_in_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..6a89d4ac748ad04d95ec440cc9e564da72e4583d GIT binary patch literal 672 zcmZWnO=`kG7@b6vwkwa&3$%L=pdgeM+NMNYC}yJ=(v?5Nq9&!5AQln9g(!Lo4^VXN z9eRYiY}$q@XkRx1p}#}~Bq zdJQrndch-gKAB7~o6Rtv&#_!CK{IXqa!#JQbjw_dVP<{b$6zo(5Cj;FMi`IB@VQ=+ zhzu1v=w>R8Hk(bf+ii3@9dx^0G#U+f^?DttR;z`6zb{#;bg4MIIaao98(OtmMWs@K z$NlP-WuaE9!EqdTQvVn8=+;Z65{kv5>`r#2vrjTqq(@WHq^d}{P$2!*q*XuziQgU2y zxY=wFFMgtTyWNRC9e=Rj@BbVv{b9LWc8}MEhzw~b8i)9D9muE~_;_z*pYjj+yW1-> Jm%qtgi(mfBP|5%R literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/scrollbutton_down_out_blue.tga b/indra/newview/skins/darkgreen/textures/scrollbutton_down_out_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..04e158ebad3c753472fe1b0de089443a499948d0 GIT binary patch literal 919 zcmYLI$!c0r7`|;1k#3qt=nJ%aS6QVrP+I6jA4Y_$l&aN4P{EZ87m5S|qToV7Q6vs= zhy!XAUThM;hz8e)Ax@@lHN$W?^rsP-YH+HRH{$gfAnvAfZT|Zx7(v% ztJN@@&9GQ3uv)F~{QQjddX3FyBPe;wsi)m!GQsWbE$B-CjK^aX3I$ZFRWuq6wA*d; zdOZvV13}4CPCf0eudgv24haAOKqi??3T35ILA_o_v)L3*q~s~5Gwq_$DEj^W3ji4k ziF|W&gM2=ZKp+6C)e4)<2A|I-qB*+xe2yb_Myu7rZnwkZ@!;<6PDDMV8ySnm0*yw4Znuj+oX#Oj zQLEJ=eU6rv2Rw+ynx3AX@E6STR zjv}3hhXCxHVZkI%R$L;kjrE;NTpI@MDchWkw`==$Ug3LIu&ar7mG#6<#HKH z-neNTC&7qCj6@=_Umy{hQ`#*KyCQSdlw2EjfDE;S;|dXm$ucziKjJKx%ca=x9o6!p x;1Ia?qzu9&OQjNBM|?#m+ds8`Qz=Sz5AVmfpQpdhzMp;l^8WY7v(Kj=r2im*iK74j literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/scrollbutton_left_in_blue.tga b/indra/newview/skins/darkgreen/textures/scrollbutton_left_in_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..4efaa9908d6c237d5b564f7719fbe9cece9870ee GIT binary patch literal 745 zcmZuvOKJi^5bZI9d^Yh2xj?e_00xARK#~aqE)-XyVn9(ugEFlMGAbg13-Py8cdk4@ zz_oYC5#loPGOt9l7zeti>eYMI-BqR3wK{x$Y zH;n0Y3L?tgU=zCPcDv~J`xp!c7>!0Cx!rD~SS-SE9KjhEw&-psrdDf>dcBTDqk&ed zg-)ju*Y&JtClM$S8@~ENq;*cPp&!bQ%pj0ZMTrMM*%OROe?$0_;Bocx$O4dQn zH|@_)rBd+4<8j1dG4O42NrPTGorcZ0;gQ*l`y!DD!r`#IS(BsaX~s@S7&9!(!f-f5 zRp|7z;GPq-X_`>1s8FkPPb3|W$1s}BrqsIn@%016s%yc$N$2x9j9#yYN~HoVbg=~Y z(5tJ}3I> r0He`paX)vo+^+2ir`@$ZPU)7&VU*uq%;0-+?$JYJx~kJr_*6>V^N_{~OMC&;16O?2T-;7Gw*uck?e43dQH?C+VgeC`r`3 zoo?03%S&`R9rXKs+}+(_G#cUl{vHnx58|XuJ?->swOTkoKL@c4fJUQ%v$Hc~G8tT5 zUE%ur8kI@~wOS3^+uJak%?O9X!cM>a{e9Hybq0V4K;huvKm8>T>`JR5J3>(GgBhPZ10TVK5jl91ijL_=xrObz!GpG#W*zR1yJR zlLm!IBqD;uVlg;PrZ;R;$r&x1nbG<&>zU)o!;Vm&=J8 z1&o5tW`o1w!1D4kBuRprPnA=mmR5_!0+yE-38J%1A08gU?RH~rZ4HCL04hwEd}Us9$?fLmMzozWnM^{NN~JK*I?PI}*Xu=WQrp|xdup&(#IhE%#$x7_Y}I+T z87pQonXtLJ2?l0=k|OC6$z)5cH9LV5FgsQJnd|j>Ld%nvkmSY11)&nB?Bn!HJk4B! bn%Q9f{Qhh4_tKB0Z(ra4`Ly(9@q_FyPBEov literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/scrollbutton_right_in_blue.tga b/indra/newview/skins/darkgreen/textures/scrollbutton_right_in_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..484f0469b60d451511b9f058e1ea4f6486ebb2a8 GIT binary patch literal 751 zcmZvaOKJi^6h*5|LOzqYglr(0y8r`1NFa$paNutwN(T}Av_b7|5hNN!1P9`8Bsz2C z0)h&H;2yGsIE>u%Eu$G|Lsi#%_ny~XRZoZuv3=~qF0RfLhr{t^jrF@Vfzg^7E`GY* zF5bn*7nEMF2WEsdL1*f`R;!`WXrNRoA)QX6QmKG8LhW`N&1O^T(k;15!ekA@K(Sbq zXe<^(zu!kZ9*1d~VA*Q5D$B7nePqam zS*g;s#kr@=_oLA$L?94=LCqElg=863RiRT;_K{#P2;ud5{}AqwkoBMtK*r-Sj(PMX=JUC{29`Ie8~~=%DUR3zi^W3T-EcTWf!Uq;zjyTI zatYgLG?KT?cYzt5$0S{{4gG$(v!A+lGFAbUR;MPp*giYtOCg I&Uqt#0pP)fO8@`> literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/scrollbutton_right_out_blue.tga b/indra/newview/skins/darkgreen/textures/scrollbutton_right_out_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..fca79181bcc65eecfc509825f13348efddbce5df GIT binary patch literal 956 zcmaJ=TT7a89Cm|hbhAFfzQA_h)vg*7#s)jFPZMQbC_}{q(M1R$SR@+dMd1NW5mU-T zAs&*^rkFOg2Ck;~<9 za&m$|Ab^#X73}Tp;o{-~XJ==kr=5PWSPb=godgg93j6!}V$5c8Zrn+1U|polXbM+9>- z*x10_+#D8I?wFz|n4O&!>+0$%I9`@0bq+h7NF)%C$6+)Yp~2u8Z?#%dCkZ(?4)Of_ z{QuB-LMI3{7z~m}Bog@tE;GKmx&oteJcoyeFqupQ%ZT{za=9cUj))||U=X!hP2#^~ z{x>%_vUc-FM@N|CRJoWIi$&U&N~MrYCWW4bMWfN@J9c|}D?7wpV)HmE?%D3{uC$2D z$sHp*_l$Wm=V9v<4xG!tYcM=D{29NyyAv%>hGC}1$H#;!ylU?UZ~X7Yi&Hbao!`Iy VnE9#xrvCEz?XM5&Pc!dSe*m`ft1kcm literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/scrollbutton_up_in_blue.tga b/indra/newview/skins/darkgreen/textures/scrollbutton_up_in_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..d8fd0a7cc1efb22180db9382146df79a7cdcc3cf GIT binary patch literal 694 zcmZWnO=`kG7@etF+O9l8FVOBifQ3M5p>0aUjX&VB-ARbWn2}n7T0{gF;@{E}cmTn* zcjyu7vhtcYVQe9RnY?*FGnp@+5EsHcS&G$9~$J{%4)9*;4ZOfZ|xKr?N8b4{MQcI(_J!^|qB(CKs#h9Ua>J_dsU6!*&z zk)c8d-Ao;$^?Dty>!Q(UpxJDq)oO7&g$xlHDs-6Wi8-}at05?rN|5Dp8I?)}s#>ig zLqvuWJtmkk!D6wfZ}dSW#k-L)wzRPo3I#ZhgXwgNcdBV3GE|J6h1CmX+cpHN)TXA9 z=48Se%;$5+Uatqw^U!|Xd_xkEiM2#TtyU|@(P#wU_Yvp_5t&#^MB3~18iGd!y7WYv zOMXyyyWQeQ|20Lp+wK1SaNSK&S-rT4h@#scNWVm5e{8uu8Pk_f4|e|9dbIBEuACd| IHh(RC0cZkW?f?J) literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/scrollbutton_up_out_blue.tga b/indra/newview/skins/darkgreen/textures/scrollbutton_up_out_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..9112d187e274597c18ea426281d2ff329f1ef62e GIT binary patch literal 929 zcmZuw%W7It6uoT{kxrUV=nu4WM;WD5C@u6wzec@E5fq=qQAXlKM8OYGR78B>Ga7v2 z`yFF626eXTI$$zrFWj@w+UM+b&R%;TNqQq4zjNtadZ&D)QmH;2{)zc8fM`O`+ru!d z)oNHSmsqdY*lae~ZnxO&cG&Ot!V=TZb?%$b=O~p*U@QqRola3K7E!HM(QG!+?RGI3 z3@{pvge9h*>)e-2CNUn5NdQ4WkV>V*;_dA%>h(HWt(FL)C8nRj+!u{TF&qwG2ngsT zb2ghrp-@1%T*l4Kjj+V@bDjG_p%8k#-U|VN+wF$QWP;gjhQ(rm)oO*!W)qf}ey$sh zMqFQCqtodKf)nP^Znt4D7_e9@V5D*qaj$&xShb`@!;y}3R& zevt(al5zMHoG~A-*Na#zhHyBHe!u_!@N_yYD0q&{NCjo_`Fx1S9(xAP@j)SqzdyA`y`oZ~mIY{r$aYFq!3(E0qeAoU!LvNb-@J9En8Y zxs`;#4-XHbRoF6APiE68iKq|(8;NvmCerY_Je7h^SX1iDUO!qrCyLc-CA_pegqLKC mF^cc$;_#=RUssx*;}iVx?dRn$^>_8xFYkYURDZtwApHf@Ta_gM literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/spacer24.tga b/indra/newview/skins/darkgreen/textures/spacer24.tga new file mode 100644 index 0000000000000000000000000000000000000000..c7cab6b38c474431acebcd5cfb10b0b4e2a8720c GIT binary patch literal 2348 zcmZQzU}As)2?hxU1&;s!|1*r@(J&ZI1EXnRG!2ZVfzdQDng&Kv8i2KiLV`kF!#smM O{rz+!+&q0;^%wwaVZPu1 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/spacer35.tga b/indra/newview/skins/darkgreen/textures/spacer35.tga new file mode 100644 index 0000000000000000000000000000000000000000..b88bc6680a405a808a1d93ec03ec1a35460b3a93 GIT binary patch literal 3404 zcmZQzU}As)Wd;cb1&;s!|1*r@(J&ZI1EXnRG!2ZVfzdQDng&MGz-Ss6O#`E8U^ET< ahjo@1LV`kF!#smM{rz+!+&q0;^%wy2>(l@M literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/spin_down_in_blue.tga b/indra/newview/skins/darkgreen/textures/spin_down_in_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..1f3dbfc3d8868d6c9ecf876c524621fe2501c600 GIT binary patch literal 340 zcmY+AL283Q6o%hqC0X?dxj?h`00{^sg)|8Tb>UhN575n|#x8{J+$kQz1Gw@Wy+W3e zKl9I^P+=bb``*W69Feum--~#%@s#iTU*=4eDPT8|h$)XE&vQtYWzcDwy5tzAbde+p zu3;ELMNxz}j-lJOg<>LcGg`E{6$Lw?rRDd}CC3&;cU^~7UDqhf62mayo9c>*gcIx7 zg|^sMRaJ#?9C4$rm`MJslkWQ-(liZzxX32Q%mpU?R%Xt9d5}BF{A#D;d3Omug7?Gg K=RSDbZRH6>)R|BK literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/spin_down_out_blue.tga b/indra/newview/skins/darkgreen/textures/spin_down_out_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..6728a6d9f26dad8786b6aded783cc469f9d323ec GIT binary patch literal 365 zcmX|-J8Ohc5QVS%fF)IaLjFL~Tcz3%AtaC&`7I)XyQWI%1H?iL3&G9^b`mVaO$2cp zNiSGf1|i+a9hc3(4CkKn%`Jwp6Lzdqwqj>1K@`Pn-u)XNpjS^0tDk#{Jzr4f)qKF6h$%N zbB_1>{T@xz!1sOVrfFhh7zXB^=b^4^R8>W6Pq(?`z5Bn^j-2B;AMc;m&(ec*cYFSF JCEctq*dM%J!UzBW literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/spin_up_in_blue.tga b/indra/newview/skins/darkgreen/textures/spin_up_in_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..4bb545e0c06b1a961d225869a8e34959f937234b GIT binary patch literal 336 zcmX|-O$viB5QRr^Azk$dy+FJ702YMOLjNd;3%3fz19X$x+C`x|cZzFI-~l{Jui&y_ znrDcC3@`6}GbACJky&$cY2jL)=iStnZ&es435Qhqi7d;Q(lq5)k|bJb52>RH$8pSI z7;+RvT-P-}>GNd=3JwwwATg11oCt9aP^;0KkbBcKY?o!pMNx3y_bhu-h&#>tN%r F=ntUUnM42p literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/spin_up_out_blue.tga b/indra/newview/skins/darkgreen/textures/spin_up_out_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..4a5cbcb946a230aa3c376e1e577b20738bda60d1 GIT binary patch literal 387 zcmX|7yK00$6rHgMOR9WAejw?sQf-J363B~ui`Yy;Okr=Mg{5F;1htA-h#LeSjij>> ztixh`GFREXaPOQs4`#TGow7rnu?;)la8*@rWKWhHpxZGidK$P zvOoku0B)KlhGD?RJkQ{Sh*`A7wOW1Ohhp0{48uU*_jo6}LWmer1bG%W{RDZQLqt)O zDURd(=(_$pj^kcHmO_XaQWg)-vJ8}3qGeg)Eso$^HQf49^h& literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/square_btn_32x128.tga b/indra/newview/skins/darkgreen/textures/square_btn_32x128.tga new file mode 100644 index 0000000000000000000000000000000000000000..495b05656370008e8821dfcb2cac8d2f1ed6b9fa GIT binary patch literal 5488 zcmY+|=~5ln6$Rk#zFaKXDG)PaMu=HV0tp02%%c!92!t2}h#4_Y0=azpqKX|SvQzn$ zIJT>j7s&5CR9+yJT3PG#z1ViuK6{;`lFHrt>tiFw`P_;9^Ock86x;&0DhL1j=eJiu za<%=(r%U`dAt3>-l1}2Z{QT_)+_{s)N@U%Exs%8xF)8o^fb)P#-lHFO7>vqHYx2RPEAIHJ3CvsX@|~bBJgdoK-S3nPhcN z#%LIx2BC>0B_|=GO(>X(W)RH5D7c!6CSnnCNr0m~LI*;&?3 zmO7DSSvBgi67(!Nya3nZ+sSf8~0n(4!S(bfqUSJS!qV*dX1 zd-x9@K7?EMunu($MmtkiR|l`It`@bdy4qU!wOmXMm)o^9HKV; zSFqT5;49oJCm z`vg<;Yd!8gov^M2$4HG+NH+F{@q!zMmk)cb{}5uL9yL=3M}mC8acj8GB+wI#?Fl_OM4&2U<%%F+s1R!@FmW#r3k;vz;7IWmoe zVQ477)AHk|uQ2rDIco?*Lqm9O>p7l3XAM2apt`L=o6X?!L72h8LBtOX4q$L#0O|wL z-p}6OKLFD|(2uzO{(khS2Kso~hrYf(m_7zaDbm~53%|Fw7oYX?_Mn%g-qX{A?w)S; zZuVerba1=7r_26|Bz03zcUK@veyl1PV)=p;>g?+HjVL2Yrk#tc)J{?nNpeKVGKy0=2LKBnYn3$M=HskDOd}17C zjEgfqK90!P_!!LS*eIN_v1l@*qoZ(jreH=!N8pW&j6gyCaAvuf*;li0 zXJ=FbeL=nU{FUU=-Y!FS%nd3fI#wrx8CrJ%y?1Y1){A&7?8K zvq_dOFh)*X(U@eJ01S}`ibW$U0^35|jyLcR<+;^PaF5h8DJXz=E?`Q@e|Al)+d-jO1?(VN#7qMs4* z^Y=d1*52anI!pa+&{u6=h5G91D*V;At8iAhL{?T;;4ZH$V|ir-M&a}28Cd4o60 zEd7f1%5UCaNu9OyW{LYH7=^f{r6nvfEWTNU&D@*CrA4@liwjs-T!dL*@D>)dTfjWa zU!WC7Xw3ZlJmRHBLH#wcs0+<&a%$|uj6`ceGNv6LT}gBZWyidz{rpDmTZ``kdmjQuu4c~g^2tWnz53?%Ty#iVkI@p zQAI|Z_`r}Xu_$JVU}D{up3vgb0v4%9f+Wco9(SIKtRUfuvt}6P7i5N=ZjA7RtRgy5 zmm7MSi(X6;Buz5IG6KX;>7$*_ZB6ILPv79|>=dVGXE;4qXPurz`zcONPZ2rcfp>Cx zjN_9NoUr`klViBY$459iK8An9;2s?v;gG=`GWdr_hwu&$4{^XcJUT$+;P3!u|KI@r z{=q&%`v-g2+h?)w@9)ECpF3cuT7@-Jl5QR)wD(t>C-Wr#+jWyOfjSxzlpeU@#O0*l@J)z+8 zS>+`ZTs-#DG4{TZ6;ZLfI3*oRiC(*2zx^wiAO8GD{OQA&{1Nkti&2Wd`tk}_AFgo8 z3i_qZmseLXmsghvU0(8p;XUi}l0TBZ=i*&(dH?=BE-v{~(#87=_!k%F@XooMUtF-x zVa_kk;GUiH88D}3CkSisCk#?xvz(fWdjz4=eF0&Xjdv^~8zyRlSBR1q zyHLc#=nlChBfGpuBqVmZ2#S1IECge(6;IcSUjNN3e*XSj{Oe{GpKSWTSs0DR*Cd>) z50~6BxqAIqv4J=mh|wfI+DX_cXcEB?E`lLw8o?0w{+%=KH~`K>Q*chXMD+Guz4TMQ zbYE}X(WhsW?0XL%^PAIax8EOUpnqpQ0E>TB`r}_d1?lEY=ab`8J<|gd10%y#Gra>t IJ=MZA>(A9d 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 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/status_buy_currency_pressed.tga b/indra/newview/skins/darkgreen/textures/status_buy_currency_pressed.tga new file mode 100644 index 0000000000000000000000000000000000000000..2b82aef0ff9d3cadf313ab20144c6a26e15f88dd GIT binary patch literal 626 zcmZva!A^rf6h+^3rLOu3{(vU^h)N(vQx!GDxT3p~mX?Gjw2NVyhK68RbihUkJ0SD*THc}9c5fU2JxgcQ?qxkO1HUrjYeG~-}j;AX*QdI zgMVwsZ9UHe#c_;Wc2AN7IXk;d?l=w(k(HlnN^db{1CH=oaO{)sNlHF`x+h*>Na zkc>SwpgxID5f!*aPqqtQTAtybZ( zqQXuAo6Tk*5uMLxxU8rYusDt}7z_m4aF`;tW+evp$k^QNc8gxGCkA~wo#1vl9eMJ7 zAFI_0Mr8~+^47fD?U3U-O;fntZWoKi0vi+m zx7*EFsF+^Ck|YT>^Z6V~G8rzFXb!tJT^5tCXczO}`sTa+`SDfxt_3yUdkNoa@0C|| E2jNX(=l}o! literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/tab_bottom_blue.tga b/indra/newview/skins/darkgreen/textures/tab_bottom_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..65c9228db4a94b8fde2c39841e39d27c0faeb6dc GIT binary patch literal 653 zcmYL`yNeoe5XWctXK`E;(knjt3#PCW#A4Oe!`JE=8!fare1hT?isEB^zd-MQxhjx0 zkShN|ii4yHXoAAR+{_+#{@^>zZ@wR9=C=!Q4R5CpAHi{jE|&{r3KHp_^zBH&kSY8k zeI=!J3MO;!^ZEYd^Lae(_j|M~77J`N8W;=)p9y&&eHbz;D12vRx7#68hsk8}%5S$@ zWG5bv|0ODI@-k%xv(xDm|Bpr^6!ZDqt7k{(a;HlMWq1@~BkZ;`e;;+|hJlAS96ui0D>*YN)((8CGo=c?? z3SHMR91i~`YyEEXymPf$MZw+2<1u%Cdbek@8J=^w9ExVMiTqNs_(Ox_bUKZGzmNa2 z*({DSnG6cfxa9G846;FTI2=Z|+r=Z>dMcGd!5NqQe*ZJs50c$(H@NvBnM~q9(=>!c zB7uWgEQS`&xL&WIo4$){72J|EtMj{cgghCB tip3%vR8<9;kw72-ilV@f6TxNrDJH}0+eszU%AKmIvFOd0fO@NZf*0!@_>ceq literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/tab_bottom_selected_blue.tga b/indra/newview/skins/darkgreen/textures/tab_bottom_selected_blue.tga new file mode 100644 index 0000000000000000000000000000000000000000..7507edabb01cd55a9d0c3c095074e8e92372ecd0 GIT binary patch literal 500 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 trHfZ0aZmA?N3&&0yxUI{xyhSgb5SCLVrN2 zAVS^U-C&{ZaG~F=t*!qVv$M0G0~M7agllVS|1*Y!g!}>7fDo>zsQAz5?(Y5=Mfg{7 zaq)kq)YR1fK;iAEQh9lK|C#*#{a*ovdr_sbvaW_E~v&!Km~?y%_o7J|BWC;pFxUPa&vS4=j7!4 zPf1Dn4>S$rxX>mb!N3G0GJyCs5dZ%Q(!lKC-~e(7IP8ElKU^InkOxwG0OXiIAf2EP g+Y7{@EkFVmsSF`Op{`+`!Jhtpx)E-kKCXHU09Q`H`2YX_ literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/tabarea.tga b/indra/newview/skins/darkgreen/textures/tabarea.tga new file mode 100644 index 0000000000000000000000000000000000000000..5517aebfc8abbd617251bcb8ce590d11f277cf72 GIT binary patch literal 1340 zcmb`>-39_-6h`4)Lna*zA00$YI*6D_x`&C6(a_K6{%>SjqAO^;xd4IRUoj^RS*Z<92B U`R;jtbz^?y;nu#dx$jQ#0U)1humAu6 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/textures.xml b/indra/newview/skins/darkgreen/textures/textures.xml new file mode 100644 index 000000000..451b70062 --- /dev/null +++ b/indra/newview/skins/darkgreen/textures/textures.xml @@ -0,0 +1,389 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/darkgreen/textures/tool_dozer.tga b/indra/newview/skins/darkgreen/textures/tool_dozer.tga new file mode 100644 index 0000000000000000000000000000000000000000..bc1cc7ade8d9a3ec205efee0320b0c0fb95f82be GIT binary patch literal 3193 zcmai%XJ}Pf6osERrq~iq%xLtF1ys-k5yg%O8Vu?LGsze=3hH3NuCW)m$%`6$?6KD< z_TGCh*n95<3zn!Lifi7tGcSb94-+`|o^#LLYwxx9UgtiKr?|)eSIOi14{;=UMvWSk z+Mz>-ui5qL)sw>=D?AAvJ$m#%jT<-Ck|j%YFMc8 zOG~pk>uc7mv3DU5_cFkAScM~yiZT$a-!q7Fw{G34z%5(02+tNST&T&DC(CtRjU78y zUSEC{$Q^LgrcKkzl`Dm-d-m*+7vG!}D^>{hupY)h$`&tPtel)2BM%>d#7jIMHf)%B z_3EXturQIs0Rsl8U%!3|4-c2iVsLVDvIY$rB+zkX)~s0;A8rDkwtf3{ITQj|V3uS! zdi1E~&6}sCOP6Z?{Q1hv%+#1MV>DvK2m`25qlU_qDWkZ!I5lnBR4x-YC@4s7XlST{ zD^#eU{{8zaH8oWuM~*aSvA1f~Dr3i8zkaDJoH2QnnN8sb~Ff#Q%&yf z-Mdxf=FOV|DUIb&-23|VtC}=vA{J`ZswH1b&>O(^K5(xpYd@Q#cV6;4sJmoHz|>({UK^XE?`CMK#{ zwQ8zdxpH3o4sqiaSIa^W476|G-WZ^^sTO(w%y0%2qFlLhnmTo=$;{KIPYsxwCF@ir z<^Jf=BYph%(I-(d>S#S2pt_=?qYFfT|Ni|vcLGUFN=k|q9u+{1foVcO#Jzj>7WAQW zL`Ex-53bAsegFQwHBeMklp-S|P3r(h6k=mzRkm!|Jh%{|2Hc;0pQLH{@ZnalBn;?C z2B2wr{GTvkf)R?A0>>4C$rSAa`DhQiLkze8q1Ucm(~KE2Ll(l&z@QLM?^&YN4h_Hw1MDIE`knWAUddE5qdaO*hB^?zckWY^4G6l28eO`5)lWO z)=5fAvU-_2cdl`Oqi|yN9zbG{S#ZD$E)1HGkYL;KvUcs-@&XtR@mH^2wIZY*0E>x< zF`1b?d$yW4Z*FtH_`_PUV#TaA3quAJhIFZ@0F%gV|! zN)ZjfF-~Q3MKY-Z9K!GBt z+qZUt0L6|gSFTuQ-Rsw{%R`^LNOnmeSmKZSDO0A{J()(SkqV@TXPk6Ert_wQHoSZH z&LHjl{qW&~#fUir;ETz_CzDHg7vZCcH%$;d0Hp&}lw%K~yLIbkF!ZgLk1GeVuu4Ei zDV<0p|N9OrN*1Ax{^YnXU%tFD%slVFLf^i9jX0?Ck|+mDJjJ{<2+fc8fEP5#ZkO&4 zfa8rDH>y*oPNvw_Hbs#}d?i;j7PaO@yc~GIDiC(CF@YES#4J`Z%I-IB-dNsX6?ndx z+O=z^9zA*}zf}S`R}n%AqI2iYwu`4;yl`&czMT(fN(12CyLSz&Fc5FJ5bS>X^hqJq z3<;vSC`%6Zo;`co;Y(83KAxQpGk;iCZcNCp9|2SO){7vX5S@;)TB_*tR;^lDAW$)p zCl0*(%?9)R!~`Z_$8QpUal*yoOm;XVo*U#Sm``u~W8ZJy!wjX#H@Cz0J_iwDWSd#? z)S^WT&g|v(Yr&V_6kp~)<^5XVjul^(`F~k>5)+bI{vG#MT>PKW$+2;5TE=+(1$H$f AumAu6 literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/tool_dozer_active.tga b/indra/newview/skins/darkgreen/textures/tool_dozer_active.tga new file mode 100644 index 0000000000000000000000000000000000000000..6099823a8347d7caef0ddcd3de290a791d5977c9 GIT binary patch literal 3279 zcmZXXcW6~f7{yKBf5%}}I!nkYHsL{PZ%a$$W@hW@!_U+Z7LkD&0)JdH?cUG4! zUF3D`+EvLtdh}4Bd-v}0xbwPo>!t~I$GkvNQj+q3$5Xp@?c{l$($dm2X3Q9k8#hi9 zCQQ(zNs}~r@?=e&I@PWdCr-5c>C>lc%9JS@F=B+0lap;M{vwt#$wE!F=K{i&z`M0bLME~%$XWLe!K-VWXKSkO>hK8AZbJw zY~H-Nfq|3Pfh8s;iYdc~54UNfM~^l@mSYwW>FMdZckiB_J$t5CuU_fp%a?li@Sz`I zYHF$m4H~3j!-iRoK&KLLuxZn#K4heWjE|4kz<~obbm&l9g6Y7K1=&1#@fO6{`t<3O^5)H}1`Qg>`}Xad0tE^bkjJZtFJHdc7_z@`;erU4D)sBv&$6~O zNIe+h+y9|?xnji%&6_t*7cXAa?&2Nr2P5wLsZ4a#>z9)T)A@T_dI#>C?+OG z#fulW=qSj82M?^pM9{l;Z}sZcOMUwEu}FvG#rHL z)vL?fw{M@qZr;2p;F1k^+O%mRlEpuAjDIzUOgW;$^pB& z(n5&9%6010(dyN!wRY`VEnK)z`}gm+W>OpqQLbD$c?=ArOSIVniUw(jf0uRCTqZ5_hAD0^X%vqbU9Nd4?oJy-J?g3 z42&z!I0w;F`VAX4X!GXH<}w6;J72$kU32HoRoSv-MfI%MIq7}Y0JyJFqlOP2|NH7cE-Ux>2!WMWq53O^0zr=!cNVutJ3jW>WL#&o|oeyk*N4 z9Xxo@lph%xX`=iuq;DNS!ckPmpzq(m3pcM_yS9}x*`QCKK5e@L#YDP5voz0K*}mvM zVPVXufcHE@t*qH*bJ=377=*WI(IVwPeE6^hK(8@A?3U7EC8bN3R^`f-?Y)DKii$E( z(M9N2qC^R8-MZCwn&{|g;|5-MpC!hTZYdp&f1KkPusU| z*Nz=K#FD_#0o*)|^m3rdOP4NL>53F7V(q~5Q%E?-A}778K-r-T=Tk-@J$jdN^ypCq>8biX<}$J6!&sgLzo`>DfZ9t1Y+=hEF*&KBrMI@`rogB z0Q-Z-|B^XHhv81>c^YK4?}Pw0$JfL$^qKiJK}$l1w7={dBy`kj85;8@^BaUa-h{g7 bzE=YAjT2%MmoMx5`SZGX@uDtW zx}+;tuISpeYr1~@x>{RXb>qej6}Gjt$zXvhDJki%nECVP>*mdyI)424H!g2#YSOJ+ zw={3wJbgzpyc|1rOlQxYwGbCBT(A)kksC!3VVL^*dh5-q7#{8I?K*Pgh)$h4r88&F zco5Ca&0ZqF>;%V;=kn#tHGTSYty!~14zuRy(W5p4@N7I}df>nTH8wWdv`(HpIga4m zxpUfyR1y33?bE`A3l%C?s1VY$Y18CjF$WJG6k-7y!2=1as;UHAU0t0V(EX@(;=~EL z6x&aqKCQ^|@^TM$#*7)7I(4cN5)$NKHAoK{r~w{VuU-{Ph#B5PhYnd$9Jr>SEV|`4 zG&CqsP*7k?PsFS(Dk`%7^YioN;9)8%Ds0`cM)E+U;^JbFEE&M>z~w;ZJAC-Cf+!o< zwQHB=&Yf%32*+NvYL#;EFu(wZ)k@7q+p}kn%F4gHZ zzH;SC<>Fz$0T1vf9=z<>vBTyFb4f{wB|<9)wmhf;xw*NMA`|vDJPe7s$X0Q_5fp>%wVC+vuDrt%AAprp*$O8Fc|c5vSlX0e-k-t*RGWx zF#5)(O`Ei6(IPpqv9Ss;Vg?Hy1OycnL63ru?>}?F$nuRFH!3+f+4ikBZ{Elm92`_6 zBRUxtJn&>i{saQMors0c&+Q!P>FHJm=2KHs_5S^PIUhcJ&=hz7=kVsoh7XdhSg}Gu z+ihqf%tAORJf$R}P$L%I^=t6h@WGcg-w4mHp_q#oFV^tz@K@on;e#)0Cc;OPLVth1 zt$0gIi*4%cOg0SFM1?$@A`pf*X0hTGq`@0D2pG6oz?Uyy+D<_e#v>f?>`t(T-I@pn)Id{wPl?9R3fB+J(_VXt(qJ@-g#1f8f9QpcydH(#l(AN3<`LiM! zF@psUJXw+d>eVY5t_NU_BjCR9?AbG0-4`!jsJ6CN>(;HaOCcnE)OF(G;uOh<87zR~ zX%CpUZ{NyvcXv-Dc=+(41*gu0F)%P-4?*IZ(7+XXsWXgRrh3QPh_glqOCWj!F}NLv4!i zFl5hwTTB#pC}P9!f7SuRy^PC~;o?T`A%#i{ODUEtS;Ez<#$NljZr%Dv=*}|q<=V%H d87_qGFZI{7rN1SnB>wXA55FfQ{e|lZuK_BN&_sYQ*7yTqu)346)Y4 zIWfk0h-lO(DvBbCI3|6ujRX}F8zpMQe7(P==V-l{Hof=Z?z{Ke-?xTuue}3-=z#b6 zArSfwawG+&Oqo(Rb?VgKUuVvoDTfg=tVE=xrM1nPHA}w*YX4LOqtw*YKLR;9IdYkb zoI7`}=FOX@`Sa&1FE3B|`T24eELfn1g$oycunA;mXKOIn?3goWj$GGOSy`Ea!JsNC zDpXlnsp{%#)zs9es;;h1gBuzev}@Nc9XxnYM~@!0-^Rv9u?QtdGiJ>A1RL^NYuBzd z=+e?sgD)>H_u(tSkKVX(qmCUrrrWn~>+IRHdi3a#PMHBDwH&Q z_;9^>^Ty)O$jAt%3Dr%D7A?}!rAxJZ`EsKyDk}O1Z4lmX*R5Np{rmTa(To@|Lc@j) z6G`gr?G?tLQVW9dBT7zAHXR^?f`S5}1gIA;UTpNsmMv2mK72>ad-v{DXJ@A+&5LOC z=+WA;WsCT|diAPKojPSsr=+C#bWvUcCr_Sis`8}hqQwAWG$C%lh3}UvS)$#$cl%87 z@$r_s&zUxF-fV$U4K^huCHZVaJhllFCJ6cSpYxELo2%KgXWIcl$CS{x@nR?=v~&3I zVWYlv>z4YXCfK)c-wJKHoF`|}q)9&cHy(LnVxo!2r3O*Z*4EZqp~%v+XV3Kd^=r8Z zVF)8;T3cK7HQF6Jb{H+CEFl_)3U~$eV;(zptdJ?fB6d#XrAwC#9*@V38>f*YN6L+h zi&HcsW?1PjR!H#>8I%%;laP=QPRdr~6>32i<>kwl?W_X5bLURoyLV47Uc8X|{{4Fm zX2c9DoQYARM)?Zz2+`jL&Y(j;VNrU7)2C0@)2C0ZQBX}_ySlpU%u^LNCMHIM7|{h- z!2&5m>ZKI2G9v@`t7O}^Z?_5&6)+rhQvC4YLv?p|%kAmu(LhGbSlgB}|2LJBe zJM#$7NDJQf2XFJCbuR+;{YQ9oMVZO`lP6F5g=e01?6ChAc$(0*ZQINY?IISW0Lg++CP`30ewXz_QIK@=NHxzCH!_?b{~@lrU(oUt;!u z(qZt24jqz%u*2Y~_kjZkgxQ!eW2{IN^TC4${bt+dKNb^vgFk-!xEzo?c>f~h0;P4J zSaj}5k&7IeyJW*9FE)x|jx|q?>_Nssu55?<(WCG?6;FVZCr|3il`B>*FABB-h5R_% zMlg^OGpt~NDA_@w+uPd}Jb(VY9Qs%o5$3pY=FAy8r{~U{6W1va_)FUSW-;K)W`QL; z=+EUeHV6AK5+-@3VA|5sV$Gc~{gUKC=C{BBpSM6Pu%yqnwY907g!E6stAaQ$T)3d- z=4M^HcFj^m5{MEgv}VmciV-ucU_p&;-n^-b>({T#0n3ZRzn^(|0en@C=qw> z-nDqjK#Ab8x_|$^Dsk4~9S96{`SjKd@WgUiE8!U!QD0wgudDh^n>KxXY0?IHv$k-0 zKD=4EhC|oL@AlFSy&rNyHh+D1=`v!5m#+6oPs>QiocQy^l%L|V6DKAm{22HfgT?AG literal 0 HcmV?d00001 diff --git a/indra/newview/skins/darkgreen/textures/toolbar_btn_disabled.tga b/indra/newview/skins/darkgreen/textures/toolbar_btn_disabled.tga new file mode 100644 index 0000000000000000000000000000000000000000..59c57fc7cd6dba4d06f9be420f1b2ca82020f40d GIT binary patch literal 12332 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 Date: Sat, 6 Sep 2014 11:30:25 -0400 Subject: [PATCH 25/34] Fix teh Singletons to have a global registry --- indra/llcommon/llsingleton.cpp | 1 + indra/llcommon/llsingleton.h | 62 +++++++++++++++++++++++++++++----- 2 files changed, 54 insertions(+), 9 deletions(-) diff --git a/indra/llcommon/llsingleton.cpp b/indra/llcommon/llsingleton.cpp index 9b49e5237..3d32d4771 100644 --- a/indra/llcommon/llsingleton.cpp +++ b/indra/llcommon/llsingleton.cpp @@ -28,4 +28,5 @@ #include "llsingleton.h" +std::map* LLSingletonRegistry::sSingletonMap = NULL; diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h index 0fad5a1fa..b1e17fc13 100644 --- a/indra/llcommon/llsingleton.h +++ b/indra/llcommon/llsingleton.h @@ -27,9 +27,33 @@ #include "llerror.h" // *TODO: eliminate this +#include #include #include +/// @brief A global registry of all singletons to prevent duplicate allocations +/// across shared library boundaries +class LL_COMMON_API LLSingletonRegistry +{ + typedef std::map TypeMap; + static TypeMap* sSingletonMap; + +public: + template static void * & get() + { + std::string name(typeid(T).name()); + if (!sSingletonMap) sSingletonMap = new TypeMap(); + + // the first entry of the pair returned by insert will be either the existing + // iterator matching our key, or the newly inserted NULL initialized entry + // see "Insert element" in http://www.sgi.com/tech/stl/UniqueAssociativeContainer.html + TypeMap::iterator result = + sSingletonMap->insert(std::make_pair(name, (void*)NULL)).first; + + return result->second; + } +}; + // LLSingleton implements the getInstance() method part of the Singleton // pattern. It can't make the derived class constructors protected, though, so // you have to do that yourself. @@ -57,7 +81,7 @@ template class LLSingleton : private boost::noncopyable { - + private: typedef enum e_init_state { @@ -67,12 +91,14 @@ private: INITIALIZED, DELETED } EInitState; - + static DERIVED_TYPE* constructSingleton() { return new DERIVED_TYPE(); } + struct SingletonData; + // stores pointer to singleton instance struct SingletonLifetimeManager { @@ -83,6 +109,7 @@ private: static void construct() { + SingletonData& sData(getData()); sData.mInitState = CONSTRUCTING; sData.mInstance = constructSingleton(); sData.mInitState = INITIALIZING; @@ -90,16 +117,18 @@ private: ~SingletonLifetimeManager() { + SingletonData& sData(getData()); if (sData.mInitState != DELETED) { deleteSingleton(); } } }; - + public: virtual ~LLSingleton() { + SingletonData& sData(getData()); sData.mInstance = NULL; sData.mInitState = DELETED; } @@ -126,15 +155,31 @@ public: */ static void deleteSingleton() { + SingletonData& sData(getData()); delete sData.mInstance; sData.mInstance = NULL; sData.mInitState = DELETED; } + static SingletonData& getData() + { + // this is static to cache the lookup results + static void * & registry = LLSingletonRegistry::get(); + + // *TODO - look into making this threadsafe + if (!registry) + { + static SingletonData data; + registry = &data; + } + + return *static_cast(registry); + } static DERIVED_TYPE* getInstance() { static SingletonLifetimeManager sLifeTimeMgr; + SingletonData& sData(getData()); switch (sData.mInitState) { @@ -168,6 +213,7 @@ public: static DERIVED_TYPE* getIfExists() { + SingletonData& sData(getData()); return sData.mInstance; } @@ -177,18 +223,20 @@ public: { return *getInstance(); } - + // Has this singleton been created uet? // Use this to avoid accessing singletons before the can safely be constructed static bool instanceExists() { + SingletonData& sData(getData()); return sData.mInitState == INITIALIZED; } - + // Has this singleton already been deleted? // Use this to avoid accessing singletons from a static object's destructor static bool destroyed() { + SingletonData& sData(getData()); return sData.mInitState == DELETED; } @@ -203,10 +251,6 @@ private: EInitState mInitState; DERIVED_TYPE* mInstance; }; - static SingletonData sData; }; - -template -typename LLSingleton::SingletonData LLSingleton::sData; #endif From 91b98bed0580751e69d49622b2c2327a844822ac Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Sat, 6 Sep 2014 18:42:24 -0400 Subject: [PATCH 26/34] Fix sex radio: Now let's hear some kinky tunes~ --- indra/newview/skins/default/xui/en-us/floater_customize.xml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/indra/newview/skins/default/xui/en-us/floater_customize.xml b/indra/newview/skins/default/xui/en-us/floater_customize.xml index b4eeaf48f..bdd0065cd 100644 --- a/indra/newview/skins/default/xui/en-us/floater_customize.xml +++ b/indra/newview/skins/default/xui/en-us/floater_customize.xml @@ -47,12 +47,10 @@ name="Legs" scale_image="true" width="82" /> - + Female - + Male From 5072f983edf41c3f5e6d45af5f06b2e3cb7fc1d2 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Sat, 6 Sep 2014 19:17:29 -0400 Subject: [PATCH 27/34] Fix up skins, remove poor line endings and remove a few nonexistent colors. --- indra/newview/skins/dark/colors.xml | 6 - indra/newview/skins/darkcatalan/colors.xml | 2 - indra/newview/skins/darkgred/colors.xml | 5 - indra/newview/skins/darkgreen/colors.xml | 6 - indra/newview/skins/darkorange/colors.xml | 6 - indra/newview/skins/emerald/colors.xml | 6 - indra/newview/skins/gred/colors.xml | 6 - indra/newview/skins/italia/colors.xml | 378 ++++++++--------- indra/newview/skins/kirstenLite2/colors.xml | 419 ++++++++++--------- indra/newview/skins/orangelife/colors.xml | 392 ++++++++--------- indra/newview/skins/ponyaquablue/colors.xml | 6 - indra/newview/skins/ponypurple/colors.xml | 5 - indra/newview/skins/pslgreen/colors.xml | 6 - indra/newview/skins/pslpurple/colors.xml | 6 - indra/newview/skins/ruby/colors.xml | 5 - indra/newview/skins/sapphire/colors.xml | 6 - indra/newview/skins/snowwhite/colors.xml | 405 +++++++++--------- indra/newview/skins/stpatrick/colors.xml | 383 +++++++++-------- indra/newview/skins/white_emerald/colors.xml | 6 - 19 files changed, 988 insertions(+), 1066 deletions(-) diff --git a/indra/newview/skins/dark/colors.xml b/indra/newview/skins/dark/colors.xml index 032351a88..c911a04f4 100644 --- a/indra/newview/skins/dark/colors.xml +++ b/indra/newview/skins/dark/colors.xml @@ -183,12 +183,6 @@ - - - - - - diff --git a/indra/newview/skins/darkcatalan/colors.xml b/indra/newview/skins/darkcatalan/colors.xml index e2579eeee..f8a009e0d 100644 --- a/indra/newview/skins/darkcatalan/colors.xml +++ b/indra/newview/skins/darkcatalan/colors.xml @@ -150,8 +150,6 @@ - - diff --git a/indra/newview/skins/darkgred/colors.xml b/indra/newview/skins/darkgred/colors.xml index 22034c252..c005b75fc 100644 --- a/indra/newview/skins/darkgred/colors.xml +++ b/indra/newview/skins/darkgred/colors.xml @@ -184,11 +184,6 @@ - - - - - diff --git a/indra/newview/skins/darkgreen/colors.xml b/indra/newview/skins/darkgreen/colors.xml index 50dfe55d3..4745c72dd 100644 --- a/indra/newview/skins/darkgreen/colors.xml +++ b/indra/newview/skins/darkgreen/colors.xml @@ -183,12 +183,6 @@ - - - - - - diff --git a/indra/newview/skins/darkorange/colors.xml b/indra/newview/skins/darkorange/colors.xml index f3ff107f0..07c97ce6e 100644 --- a/indra/newview/skins/darkorange/colors.xml +++ b/indra/newview/skins/darkorange/colors.xml @@ -186,12 +186,6 @@ - - - - - - diff --git a/indra/newview/skins/emerald/colors.xml b/indra/newview/skins/emerald/colors.xml index 57f34271a..9fd1a9c31 100644 --- a/indra/newview/skins/emerald/colors.xml +++ b/indra/newview/skins/emerald/colors.xml @@ -184,12 +184,6 @@ - - - - - - diff --git a/indra/newview/skins/gred/colors.xml b/indra/newview/skins/gred/colors.xml index 6ecb33e97..521f3fdb6 100644 --- a/indra/newview/skins/gred/colors.xml +++ b/indra/newview/skins/gred/colors.xml @@ -183,12 +183,6 @@ - - - - - - diff --git a/indra/newview/skins/italia/colors.xml b/indra/newview/skins/italia/colors.xml index a44b198bd..6f50ed257 100644 --- a/indra/newview/skins/italia/colors.xml +++ b/indra/newview/skins/italia/colors.xml @@ -1,195 +1,197 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + diff --git a/indra/newview/skins/kirstenLite2/colors.xml b/indra/newview/skins/kirstenLite2/colors.xml index 45ed05b9d..0407e9c41 100644 --- a/indra/newview/skins/kirstenLite2/colors.xml +++ b/indra/newview/skins/kirstenLite2/colors.xml @@ -1,212 +1,213 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/orangelife/colors.xml b/indra/newview/skins/orangelife/colors.xml index 296697ecb..dd6fdc37e 100644 --- a/indra/newview/skins/orangelife/colors.xml +++ b/indra/newview/skins/orangelife/colors.xml @@ -1,197 +1,197 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/ponyaquablue/colors.xml b/indra/newview/skins/ponyaquablue/colors.xml index b48208f68..541777338 100644 --- a/indra/newview/skins/ponyaquablue/colors.xml +++ b/indra/newview/skins/ponyaquablue/colors.xml @@ -185,12 +185,6 @@ - - - - - - diff --git a/indra/newview/skins/ponypurple/colors.xml b/indra/newview/skins/ponypurple/colors.xml index 8cde4c258..07c97ce6e 100644 --- a/indra/newview/skins/ponypurple/colors.xml +++ b/indra/newview/skins/ponypurple/colors.xml @@ -186,11 +186,6 @@ - - - - - diff --git a/indra/newview/skins/pslgreen/colors.xml b/indra/newview/skins/pslgreen/colors.xml index 10647478b..4f1a5838a 100644 --- a/indra/newview/skins/pslgreen/colors.xml +++ b/indra/newview/skins/pslgreen/colors.xml @@ -183,12 +183,6 @@ - - - - - - diff --git a/indra/newview/skins/pslpurple/colors.xml b/indra/newview/skins/pslpurple/colors.xml index 10647478b..4f1a5838a 100644 --- a/indra/newview/skins/pslpurple/colors.xml +++ b/indra/newview/skins/pslpurple/colors.xml @@ -183,12 +183,6 @@ - - - - - - diff --git a/indra/newview/skins/ruby/colors.xml b/indra/newview/skins/ruby/colors.xml index f55f4c2e5..ae62cfda5 100644 --- a/indra/newview/skins/ruby/colors.xml +++ b/indra/newview/skins/ruby/colors.xml @@ -183,11 +183,6 @@ - - - - - diff --git a/indra/newview/skins/sapphire/colors.xml b/indra/newview/skins/sapphire/colors.xml index 0b5e343e1..53dd85540 100644 --- a/indra/newview/skins/sapphire/colors.xml +++ b/indra/newview/skins/sapphire/colors.xml @@ -190,12 +190,6 @@ - - - - - - diff --git a/indra/newview/skins/snowwhite/colors.xml b/indra/newview/skins/snowwhite/colors.xml index 85e2c6399..4cdecf112 100644 --- a/indra/newview/skins/snowwhite/colors.xml +++ b/indra/newview/skins/snowwhite/colors.xml @@ -1,210 +1,207 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + diff --git a/indra/newview/skins/stpatrick/colors.xml b/indra/newview/skins/stpatrick/colors.xml index a2acbaf9e..5bc5d22fd 100644 --- a/indra/newview/skins/stpatrick/colors.xml +++ b/indra/newview/skins/stpatrick/colors.xml @@ -1,197 +1,196 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/white_emerald/colors.xml b/indra/newview/skins/white_emerald/colors.xml index 4cbe81f9d..bdb32f9eb 100644 --- a/indra/newview/skins/white_emerald/colors.xml +++ b/indra/newview/skins/white_emerald/colors.xml @@ -183,12 +183,6 @@ - - - - - - From b127dd514d97eb0fa52169d965fb0dc278a5c470 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Sun, 7 Sep 2014 12:40:46 -0400 Subject: [PATCH 28/34] Stylistic changes and such. --- indra/newview/llagent.cpp | 2 ++ indra/newview/llvieweraudio.cpp | 7 +++---- indra/newview/llviewermenu.cpp | 12 +----------- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 013c45c14..a8fa1568b 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -812,6 +812,8 @@ void LLAgent::toggleFlying() bool LLAgent::enableFlying() { BOOL sitting = FALSE; + static LLCachedControl continue_flying_on_unsit(gSavedSettings, "LiruContinueFlyingOnUnsit", false); + if (!continue_flying_on_unsit) if (isAgentAvatarValid()) { sitting = gAgentAvatarp->isSitting(); diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index 8f7a0ed65..164419dce 100644 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -243,12 +243,11 @@ void audio_update_wind(bool fade) volume_delta = (LLFrameTimer::getFrameDeltaTimeF32() / WIND_SOUND_TRANSITION_TIME) * max_wind_volume; } - static LLCachedControl MuteWind("MuteWind"); - static LLCachedControl ContinueFlying("LiruContinueFlyingOnUnsit"); + static LLCachedControl MuteWind(gSavedSettings, "MuteWind", false); + static LLCachedControl ContinueFlying(gSavedSettings, "LiruContinueFlyingOnUnsit", false); // mute wind entirely when the user asked or when the user is seated, but flying - if (MuteWind || (ContinueFlying && gAgentAvatarp&& gAgentAvatarp->isSitting())) + if (MuteWind || (ContinueFlying && gAgentAvatarp && gAgentAvatarp->isSitting())) { - // volume decreases by itself gAudiop->mMaxWindGain = 0.f; } // mute wind when not /*flying*/ in air diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index d9c88d91e..1c671f314 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -3981,17 +3981,7 @@ class LLWorldEnableFly : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - BOOL sitting = FALSE; - static LLCachedControl continue_flying_on_unsit("LiruContinueFlyingOnUnsit"); - if (continue_flying_on_unsit) - { - sitting = false; - } - else if (gAgentAvatarp) - { - sitting = gAgentAvatarp->isSitting(); - } - gMenuHolder->findControl(userdata["control"].asString())->setValue(!sitting); + gMenuHolder->findControl(userdata["control"].asString())->setValue(gAgent.enableFlying()); return true; } }; From 724ea77befe6236c61c4fb2831310418314b2d52 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Sun, 7 Sep 2014 12:43:18 -0400 Subject: [PATCH 29/34] Translate Render muted avatars to francais --- .../skins/default/xui/en-us/panel_preferences_ascent_system.xml | 2 +- .../skins/default/xui/fr/panel_preferences_ascent_system.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en-us/panel_preferences_ascent_system.xml b/indra/newview/skins/default/xui/en-us/panel_preferences_ascent_system.xml index 55962a81f..188f6569e 100644 --- a/indra/newview/skins/default/xui/en-us/panel_preferences_ascent_system.xml +++ b/indra/newview/skins/default/xui/en-us/panel_preferences_ascent_system.xml @@ -99,7 +99,7 @@ - + diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_ascent_system.xml b/indra/newview/skins/default/xui/fr/panel_preferences_ascent_system.xml index eab807607..11d25e01a 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_ascent_system.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_ascent_system.xml @@ -79,6 +79,7 @@ + From 89fcf69948da08c886e7feffb6fd77cf74c48c59 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sun, 7 Sep 2014 15:22:19 -0500 Subject: [PATCH 30/34] Added several temporary fasttimers to better pinpoint idle stall. --- indra/newview/llappviewer.cpp | 254 ++++++++++++++++++++-------------- 1 file changed, 150 insertions(+), 104 deletions(-) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index caf66d6bc..6594bc8de 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3705,37 +3705,55 @@ static LLFastTimer::DeclareTimer FTM_VLMANAGER("VL Manager"); /////////////////////////////////////////////////////// void LLAppViewer::idle() { +//LAZY_FT is just temporary. +#define LAZY_FT(str) static LLFastTimer::DeclareTimer ftm(str); LLFastTimer t(ftm) pingMainloopTimeout("Main:Idle"); - + // Update frame timers static LLTimer idle_timer; - LLFrameTimer::updateFrameTimeAndCount(); - LLEventTimer::updateClass(); - LLCriticalDamp::updateInterpolants(); - LLMortician::updateClass(); - F32 dt_raw = idle_timer.getElapsedTimeAndResetF32(); - - // Cap out-of-control frame times - // Too low because in menus, swapping, debugger, etc. - // Too high because idle called with no objects in view, etc. - const F32 MIN_FRAME_RATE = 1.f; - const F32 MAX_FRAME_RATE = 200.f; - - F32 frame_rate_clamped = 1.f / dt_raw; - frame_rate_clamped = llclamp(frame_rate_clamped, MIN_FRAME_RATE, MAX_FRAME_RATE); - gFrameDTClamped = 1.f / frame_rate_clamped; - - // Global frame timer - // Smoothly weight toward current frame - gFPSClamped = (frame_rate_clamped + (4.f * gFPSClamped)) / 5.f; - - F32 qas = gSavedSettings.getF32("QuitAfterSeconds"); - if (qas > 0.f) { - if (gRenderStartTime.getElapsedTimeF32() > qas) + LAZY_FT("updateFrameTimeAndCount"); + LLFrameTimer::updateFrameTimeAndCount(); + } + { + LAZY_FT("LLEventTimer::updateClass"); + LLEventTimer::updateClass(); + } + { + LAZY_FT("LLCriticalDamp::updateInterpolants"); + LLCriticalDamp::updateInterpolants(); + } + { + LAZY_FT("LLMortician::updateClass"); + LLMortician::updateClass(); + } + F32 dt_raw; + { + LAZY_FT("UpdateGlobalTimers"); + dt_raw = idle_timer.getElapsedTimeAndResetF32(); + + // Cap out-of-control frame times + // Too low because in menus, swapping, debugger, etc. + // Too high because idle called with no objects in view, etc. + const F32 MIN_FRAME_RATE = 1.f; + const F32 MAX_FRAME_RATE = 200.f; + + F32 frame_rate_clamped = 1.f / dt_raw; + frame_rate_clamped = llclamp(frame_rate_clamped, MIN_FRAME_RATE, MAX_FRAME_RATE); + gFrameDTClamped = 1.f / frame_rate_clamped; + + // Global frame timer + // Smoothly weight toward current frame + gFPSClamped = (frame_rate_clamped + (4.f * gFPSClamped)) / 5.f; + + F32 qas = gSavedSettings.getF32("QuitAfterSeconds"); + if (qas > 0.f) { - LLAppViewer::instance()->forceQuit(); + if (gRenderStartTime.getElapsedTimeF32() > qas) + { + LLAppViewer::instance()->forceQuit(); + } } } @@ -3751,38 +3769,44 @@ void LLAppViewer::idle() // Must wait until both have avatar object and mute list, so poll // here. - request_initial_instant_messages(); + { + LAZY_FT("request_initial_instant_messages"); + request_initial_instant_messages(); + } /////////////////////////////////// // // Special case idle if still starting up // - if (LLStartUp::getStartupState() < STATE_STARTED) { - // Skip rest if idle startup returns false (essentially, no world yet) - gGLActive = TRUE; - if (!idle_startup()) + LAZY_FT("idle_startup"); + if (LLStartUp::getStartupState() < STATE_STARTED) { + // Skip rest if idle startup returns false (essentially, no world yet) + gGLActive = TRUE; + if (!idle_startup()) + { + gGLActive = FALSE; + return; + } gGLActive = FALSE; - return; } - gGLActive = FALSE; } - - F32 yaw = 0.f; // radians + + F32 yaw = 0.f; // radians if (!gDisconnected) { LLFastTimer t(FTM_NETWORK); // Update spaceserver timeinfo - LLWorld::getInstance()->setSpaceTimeUSec(LLWorld::getInstance()->getSpaceTimeUSec() + (U32)(dt_raw * SEC_TO_MICROSEC)); - - - ////////////////////////////////////// - // - // Update simulator agent state - // + LLWorld::getInstance()->setSpaceTimeUSec(LLWorld::getInstance()->getSpaceTimeUSec() + (U32)(dt_raw * SEC_TO_MICROSEC)); + + + ////////////////////////////////////// + // + // Update simulator agent state + // if (gSavedSettings.getBOOL("RotateRight")) { @@ -3795,22 +3819,22 @@ void LLAppViewer::idle() gAgentPilot.updateTarget(); gAgent.autoPilot(&yaw); } - - static LLFrameTimer agent_update_timer; - static U32 last_control_flags; - - // When appropriate, update agent location to the simulator. - F32 agent_update_time = agent_update_timer.getElapsedTimeF32(); - BOOL flags_changed = gAgent.controlFlagsDirty() || (last_control_flags != gAgent.getControlFlags()); - - if (flags_changed || (agent_update_time > (1.0f / (F32) AGENT_UPDATES_PER_SECOND))) - { - LLFastTimer t(FTM_AGENT_UPDATE); - // Send avatar and camera info - last_control_flags = gAgent.getControlFlags(); + + static LLFrameTimer agent_update_timer; + static U32 last_control_flags; + + // When appropriate, update agent location to the simulator. + F32 agent_update_time = agent_update_timer.getElapsedTimeF32(); + BOOL flags_changed = gAgent.controlFlagsDirty() || (last_control_flags != gAgent.getControlFlags()); + + if (flags_changed || (agent_update_time > (1.0f / (F32)AGENT_UPDATES_PER_SECOND))) + { + LLFastTimer t(FTM_AGENT_UPDATE); + // Send avatar and camera info + last_control_flags = gAgent.getControlFlags(); send_agent_update(TRUE); - agent_update_timer.reset(); - } + agent_update_timer.reset(); + } } ////////////////////////////////////// @@ -3819,6 +3843,7 @@ void LLAppViewer::idle() // // { + LAZY_FT("Frame Stats"); // Initialize the viewer_stats_timer with an already elapsed time // of SEND_STATS_PERIOD so that the initial stats report will // be sent immediately. @@ -3862,26 +3887,26 @@ void LLAppViewer::idle() } gFrameStats.addFrameData(); } - + if (!gDisconnected) { LLFastTimer t(FTM_NETWORK); - - //////////////////////////////////////////////// - // - // Network processing - // - // NOTE: Starting at this point, we may still have pointers to "dead" objects - // floating throughout the various object lists. - // + + //////////////////////////////////////////////// + // + // Network processing + // + // NOTE: Starting at this point, we may still have pointers to "dead" objects + // floating throughout the various object lists. + // idleNameCache(); - - gFrameStats.start(LLFrameStats::IDLE_NETWORK); + + gFrameStats.start(LLFrameStats::IDLE_NETWORK); stop_glerror(); idleNetwork(); - stop_glerror(); - - gFrameStats.start(LLFrameStats::AGENT_MISC); + stop_glerror(); + + gFrameStats.start(LLFrameStats::AGENT_MISC); // Check for away from keyboard, kick idle agents. idle_afk_check(); @@ -3897,15 +3922,15 @@ void LLAppViewer::idle() // { -// LLFastTimer t(FTM_IDLE_CB); + LLFastTimer t(FTM_IDLE_CB); // Do event notifications if necessary. Yes, we may want to move this elsewhere. gEventNotifier.update(); - + gIdleCallbacks.callFunctions(); gInventory.idleNotifyObservers(); } - + // Metrics logging (LLViewerAssetStats, etc.) { static LLTimer report_interval; @@ -3914,22 +3939,23 @@ void LLAppViewer::idle() F32 seconds = report_interval.getElapsedTimeF32(); if (seconds >= app_metrics_interval) { - metricsSend(! gDisconnected); + LAZY_FT("metricsSend"); + metricsSend(!gDisconnected); report_interval.reset(); } } if (gDisconnected) - { + { return; - } + } - static const LLCachedControl hide_tp_screen("AscentDisableTeleportScreens",false); + static const LLCachedControl hide_tp_screen("AscentDisableTeleportScreens", false); LLAgent::ETeleportState tp_state = gAgent.getTeleportState(); if (!hide_tp_screen && tp_state != LLAgent::TELEPORT_NONE && tp_state != LLAgent::TELEPORT_LOCAL && tp_state != LLAgent::TELEPORT_PENDING) - { + { return; - } + } gViewerWindow->updateUI(); @@ -3939,11 +3965,12 @@ void LLAppViewer::idle() /////////////////////////////////////// // Agent and camera movement // - LLCoordGL current_mouse = gViewerWindow->getCurrentMouse(); + LLCoordGL current_mouse = gViewerWindow->getCurrentMouse(); { // After agent and camera moved, figure out if we need to // deselect objects. + LAZY_FT("deselectAllIfTooFar"); LLSelectMgr::getInstance()->deselectAllIfTooFar(); } @@ -3958,15 +3985,15 @@ void LLAppViewer::idle() } { - LLFastTimer t(FTM_OBJECTLIST_UPDATE); + LLFastTimer t(FTM_OBJECTLIST_UPDATE); gFrameStats.start(LLFrameStats::OBJECT_UPDATE); - - if (!(logoutRequestSent() && hasSavedFinalSnapshot())) + + if (!(logoutRequestSent() && hasSavedFinalSnapshot())) { gObjectList.update(gAgent, *LLWorld::getInstance()); } } - + ////////////////////////////////////// // // Deletes objects... @@ -3985,7 +4012,7 @@ void LLAppViewer::idle() LLDrawable::cleanupDeadDrawables(); } } - + // // After this point, in theory we should never see a dead object // in the various object/drawable lists. @@ -4019,25 +4046,29 @@ void LLAppViewer::idle() LLFastTimer t(FTM_NETWORK); gVLManager.unpackData(); } - + ///////////////////////// // // Update surfaces, and surface textures as well. // - LLWorld::getInstance()->updateVisibilities(); + { + LAZY_FT("updateVisibilities"); + LLWorld::getInstance()->updateVisibilities(); + } { const F32 max_region_update_time = .001f; // 1ms LLFastTimer t(FTM_REGION_UPDATE); LLWorld::getInstance()->updateRegions(max_region_update_time); } - + ///////////////////////// // // Update weather effects // if (!gNoRender) { + LAZY_FT("Weather"); #if ENABLE_CLASSIC_CLOUDS LLWorld::getInstance()->updateClouds(gFrameDTClamped); #endif @@ -4054,7 +4085,7 @@ void LLAppViewer::idle() gWindVec = regionp->mWind.getVelocity(wind_position_region); // Compute average wind and use to drive motion of water - + average_wind = regionp->mWind.getAverage(); #if ENABLE_CLASSIC_CLOUDS F32 cloud_density = regionp->mCloudLayer.getDensityRegion(wind_position_region); @@ -4069,13 +4100,13 @@ void LLAppViewer::idle() } } stop_glerror(); - + ////////////////////////////////////// // // Sort and cull in the new renderer are moved to pipeline.cpp // Here, particles are updated and drawables are moved. // - + if (!gNoRender) { LLFastTimer t(FTM_WORLD_UPDATE); @@ -4087,26 +4118,38 @@ void LLAppViewer::idle() } stop_glerror(); - if (LLViewerJoystick::getInstance()->getOverrideCamera()) { - LLViewerJoystick::getInstance()->moveFlycam(); - } - else - { - if (LLToolMgr::getInstance()->inBuildMode()) + LAZY_FT("Move*"); + if (LLViewerJoystick::getInstance()->getOverrideCamera()) { - LLViewerJoystick::getInstance()->moveObjects(); + LLViewerJoystick::getInstance()->moveFlycam(); } + else + { + if (LLToolMgr::getInstance()->inBuildMode()) + { + LLViewerJoystick::getInstance()->moveObjects(); + } - gAgentCamera.updateCamera(); + gAgentCamera.updateCamera(); + } } // update media focus - LLViewerMediaFocus::getInstance()->update(); - + { + LAZY_FT("Media Focus"); + LLViewerMediaFocus::getInstance()->update(); + } + // Update marketplace - LLMarketplaceInventoryImporter::update(); - LLMarketplaceInventoryNotifications::update(); + { + LAZY_FT("MPII::update"); + LLMarketplaceInventoryImporter::update(); + } + { + LAZY_FT("MPIN::update"); + LLMarketplaceInventoryNotifications::update(); + } // objects and camera should be in sync, do LOD calculations now { @@ -4115,7 +4158,10 @@ void LLAppViewer::idle() } // Execute deferred tasks. - LLDeferredTaskList::instance().run(); + { + LAZY_FT("DeferredTaskRun"); + LLDeferredTaskList::instance().run(); + } // Handle shutdown process, for example, // wait for floaters to close, send quit message, From b198e296cb805f99b93d5b212c5dd288975cef30 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Sun, 7 Sep 2014 17:32:08 -0400 Subject: [PATCH 31/34] Allow right clicking avatar lists with multiple avatars selected to invite to group. --- indra/newview/llavataractions.cpp | 14 ++++++++------ indra/newview/llavataractions.h | 3 ++- indra/newview/llpanelavatar.cpp | 2 +- indra/newview/llviewermenu.cpp | 2 +- .../skins/default/xui/en-us/menu_avs_list.xml | 2 +- .../newview/skins/default/xui/en-us/menu_radar.xml | 2 +- 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index fae1b7c3d..2af9ee120 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -687,13 +687,18 @@ bool LLAvatarActions::canOfferTeleport(const uuid_vec_t& ids) void LLAvatarActions::inviteToGroup(const LLUUID& id) { - LLFloaterGroupPicker* widget = LLFloaterGroupPicker::showInstance(LLSD(id)); + inviteToGroup(uuid_vec_t(1, id)); +} + +void LLAvatarActions::inviteToGroup(const uuid_vec_t& ids) +{ + LLFloaterGroupPicker* widget = LLFloaterGroupPicker::showInstance(LLSD(ids.front())); if (widget) { widget->center(); widget->setPowersMask(GP_MEMBER_INVITE); widget->removeNoneOption(); - widget->setSelectGroupCallback(boost::bind(callback_invite_to_group, _1, id)); + widget->setSelectGroupCallback(boost::bind(callback_invite_to_group, _1, ids)); } } @@ -767,11 +772,8 @@ void ban_from_group(const uuid_vec_t& ids) // // static -void LLAvatarActions::callback_invite_to_group(LLUUID group_id, LLUUID id) +void LLAvatarActions::callback_invite_to_group(LLUUID group_id, uuid_vec_t& agent_ids) { - uuid_vec_t agent_ids; - agent_ids.push_back(id); - LLFloaterGroupInvite::showForGroup(group_id, &agent_ids); } diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h index 3bb613185..5488c34c2 100644 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -155,6 +155,7 @@ public: * Invite avatar to a group. */ static void inviteToGroup(const LLUUID& id); + static void inviteToGroup(const uuid_vec_t& ids); /** * Kick avatar off grid @@ -217,7 +218,7 @@ private: static bool handleKick(const LLSD& notification, const LLSD& response); static bool handleFreeze(const LLSD& notification, const LLSD& response); static bool handleUnfreeze(const LLSD& notification, const LLSD& response); - static void callback_invite_to_group(LLUUID group_id, LLUUID id); + static void callback_invite_to_group(LLUUID group_id, uuid_vec_t& ids); static void on_avatar_name_cache_teleport_request(const LLUUID& id, const LLAvatarName& av_name); public: diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 60e6768e9..f8cecab8c 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -473,7 +473,7 @@ BOOL LLPanelAvatarSecondLife::postBuild(void) getChild("Find on Map")->setCommitCallback(boost::bind(LLAvatarActions::showOnMap, boost::bind(&LLPanelAvatar::getAvatarID, pa))); getChild("Instant Message...")->setCommitCallback(boost::bind(LLAvatarActions::startIM, boost::bind(&LLPanelAvatar::getAvatarID, pa))); - getChild("GroupInvite_Button")->setCommitCallback(boost::bind(LLAvatarActions::inviteToGroup, boost::bind(&LLPanelAvatar::getAvatarID, pa))); + getChild("GroupInvite_Button")->setCommitCallback(boost::bind(static_cast(LLAvatarActions::inviteToGroup), boost::bind(&LLPanelAvatar::getAvatarID, pa))); getChild("Add Friend...")->setCommitCallback(boost::bind(LLAvatarActions::requestFriendshipDialog, boost::bind(&LLPanelAvatar::getAvatarID, pa))); getChild("Pay...")->setCommitCallback(boost::bind(LLAvatarActions::pay, boost::bind(&LLPanelAvatar::getAvatarID, pa))); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 1c671f314..2961a1745 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -9052,7 +9052,7 @@ class ListInviteToGroup : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - LLAvatarActions::inviteToGroup(get_focused_list_id_selected()); + LLAvatarActions::inviteToGroup(get_focused_list_ids_selected()); return true; } }; diff --git a/indra/newview/skins/default/xui/en-us/menu_avs_list.xml b/indra/newview/skins/default/xui/en-us/menu_avs_list.xml index 2ba08eaaa..feb47745d 100644 --- a/indra/newview/skins/default/xui/en-us/menu_avs_list.xml +++ b/indra/newview/skins/default/xui/en-us/menu_avs_list.xml @@ -42,7 +42,7 @@ - + diff --git a/indra/newview/skins/default/xui/en-us/menu_radar.xml b/indra/newview/skins/default/xui/en-us/menu_radar.xml index 0a9e734aa..2f06bbf3c 100644 --- a/indra/newview/skins/default/xui/en-us/menu_radar.xml +++ b/indra/newview/skins/default/xui/en-us/menu_radar.xml @@ -43,7 +43,7 @@ - + From 2db2c963295506bc3af9b762a1f3ce7c45a90ade Mon Sep 17 00:00:00 2001 From: Cinder Biscuits Date: Sun, 7 Sep 2014 20:16:22 -0600 Subject: [PATCH 32/34] Fix find evaluation on newer versions of clang (and 64-bit macs) --- indra/llvfs/lldir_mac.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp index 114dc0c47..b6ba5e308 100644 --- a/indra/llvfs/lldir_mac.cpp +++ b/indra/llvfs/lldir_mac.cpp @@ -150,7 +150,7 @@ LLDir_Mac::LLDir_Mac() CFURLRef resourcesURLRef = CFBundleCopyResourcesDirectoryURL(mainBundleRef); CFURLRefToLLString(resourcesURLRef, mAppRODataDir, true); - U32 build_dir_pos = mExecutableDir.rfind("/indra/build-darwin-"); + size_t build_dir_pos = mExecutableDir.rfind("/indra/build-darwin-"); if (build_dir_pos != std::string::npos) { // ...we're in a dev checkout From 1c7772e73132a8d7e4eeb352bb5d2a59419f362c Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Mon, 8 Sep 2014 21:25:12 -0400 Subject: [PATCH 33/34] Sync with Alchemy, fixes not being able to send calling cards to people. --- .../app_settings/settings_per_account.xml | 37 +++------- indra/newview/llgiveinventory.cpp | 74 ++++++++++--------- indra/newview/llviewermessage.cpp | 6 +- 3 files changed, 55 insertions(+), 62 deletions(-) diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index d5c721237..7e369cf26 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -216,31 +216,18 @@ - AscentInstantMessageResponseRepeat - - Comment - Whether to keep on resending the autoresponse every line they send - Persist - 1 - Type - Boolean - Value - 0 - - - AscentInstantMessageShowOnTyping - - Comment - Whether to perform the autorespond the moment they begin to type instead of waiting for an actual message - Persist - 1 - Type - Boolean - Value - 0 - - + AscentInstantMessageResponseRepeat + + Comment + Whether to keep on resending the autoresponse every line they send + Persist + 1 + Type + Boolean + Value + 0 + AutoresponseAnyone Comment @@ -438,7 +425,7 @@ Boolean Value 0 - + BusyModeResponseItemID Comment diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp index 25885e68f..8cdcf5589 100644 --- a/indra/newview/llgiveinventory.cpp +++ b/indra/newview/llgiveinventory.cpp @@ -128,36 +128,31 @@ bool LLGiveInventory::isInventoryGiveAcceptable(const LLInventoryItem* item) { return false; } - - + bool acceptable = true; switch(item->getType()) { - case LLAssetType::AT_CALLINGCARD: - acceptable = false; - break; case LLAssetType::AT_OBJECT: - // - /*if(my_avatar->isWearingAttachment(item->getUUID())) + /* + if (get_is_item_worn(item->getUUID())) { acceptable = false; - }*/ - // + } + */ break; case LLAssetType::AT_BODYPART: case LLAssetType::AT_CLOTHING: { // /*bool copyable = false; - if(item->getPermissions().allowCopyBy(gAgent.getID())) copyable = true; + if(item->getPermissions().allowCopyBy(gAgentID)) copyable = true; - if(!copyable && gAgentWearables.isWearingItem(item->getUUID())) + if (!copyable || get_is_item_worn(item->getUUID())) { acceptable = false; }*/ // } - break; default: break; @@ -185,20 +180,16 @@ bool LLGiveInventory::isInventoryGroupGiveAcceptable(const LLInventoryItem* item bool acceptable = true; - switch(item->getType()) { - case LLAssetType::AT_CALLINGCARD: - acceptable = false; - break; - // - /*case LLAssetType::AT_OBJECT: + case LLAssetType::AT_OBJECT: + /* if(gAgentAvatarp->isWearingAttachment(item->getUUID())) { acceptable = false; - }* - break;*/ - // + } + */ + break; default: break; } @@ -245,11 +236,17 @@ void LLGiveInventory::doGiveInventoryCategory(const LLUUID& to_agent, const LLUUID& im_session_id) { - if (!cat) return; + if (!cat) + { + return; + } llinfos << "LLGiveInventory::giveInventoryCategory() - " << cat->getUUID() << llendl; - if (!isAgentAvatarValid()) return; + if (!isAgentAvatarValid()) + { + return; + } // Test out how many items are being given. LLViewerInventoryCategory::cat_array_t cats; @@ -275,17 +272,17 @@ void LLGiveInventory::doGiveInventoryCategory(const LLUUID& to_agent, LLNotificationsUtil::add("IncompleteInventory"); return; } - count = items.count() + cats.count(); - if(count > MAX_ITEMS) - { + count = items.count() + cats.count(); + if(count > MAX_ITEMS) + { LLNotificationsUtil::add("TooManyItems"); - return; - } - else if(count == 0) - { + return; + } + else if(count == 0) + { LLNotificationsUtil::add("NoItems"); - return; - } + return; + } else { if(0 == giveable.countNoCopy()) @@ -358,6 +355,7 @@ bool LLGiveInventory::handleCopyProtectedItem(const LLSD& notification, const LL S32 option = LLNotificationsUtil::getSelectedOption(notification, response); LLSD itmes = notification["payload"]["items"]; LLInventoryItem* item = NULL; + bool give_successful = true; switch(option) { case 0: // "Yes" @@ -376,15 +374,17 @@ bool LLGiveInventory::handleCopyProtectedItem(const LLSD& notification, const LL else { LLNotificationsUtil::add("CannotGiveItem"); + give_successful = false; } } break; default: // no, cancel, whatever, who cares, not yes. LLNotificationsUtil::add("TransactionCancelled"); + give_successful = false; break; } - return false; + return give_successful; } // static @@ -419,6 +419,7 @@ void LLGiveInventory::commitGiveInventoryItem(const LLUUID& to_agent, bucket, BUCKET_SIZE); gAgent.sendReliableMessage(); + // if (gSavedSettings.getBOOL("BroadcastViewerEffects")) { @@ -486,7 +487,10 @@ void LLGiveInventory::commitGiveInventoryCategory(const LLUUID& to_agent, const LLUUID& im_session_id) { -if(!cat) return; + if(!cat) + { + return; + } llinfos << "LLGiveInventory::commitGiveInventoryCategory() - " << cat->getUUID() << llendl; @@ -565,6 +569,7 @@ if(!cat) return; bucket_size); gAgent.sendReliableMessage(); delete[] bucket; + // if (gSavedSettings.getBOOL("BroadcastViewerEffects")) { @@ -585,4 +590,5 @@ if(!cat) return; logInventoryOffer(to_agent, im_session_id); } } + // EOF diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 37ed70519..1eb6244f6 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2464,8 +2464,8 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) LLGiveInventory::doGiveInventoryItem(from_id, item, computed_session_id); if (show_autoresponded) { - gIMMgr->addMessage(computed_session_id, from_id, name, - llformat("%s %s \"%s\"", pns_name.c_str(), LLTrans::getString("IM_autoresponse_sent_item").c_str(), item->getName().c_str())); + gIMMgr->addMessage(computed_session_id, from_id, name, + llformat("%s %s \"%s\"", pns_name.c_str(), LLTrans::getString("IM_autoresponse_sent_item").c_str(), item->getName().c_str())); } } } @@ -2636,7 +2636,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) if (show_autoresponded) { gIMMgr->addMessage(computed_session_id, from_id, name, - llformat("%s %s \"%s\"", pns_name.c_str(), LLTrans::getString("IM_autoresponse_sent_item").c_str(), item->getName().c_str())); + llformat("%s %s \"%s\"", pns_name.c_str(), LLTrans::getString("IM_autoresponse_sent_item").c_str(), item->getName().c_str())); } } } From a5ac768540834cd10d2a0fae565245cf2538e56b Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Tue, 9 Sep 2014 12:38:29 -0400 Subject: [PATCH 34/34] Don't play empty audio urls. --- indra/newview/llmediafilter.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/indra/newview/llmediafilter.cpp b/indra/newview/llmediafilter.cpp index 56d01e422..528dfc86f 100644 --- a/indra/newview/llmediafilter.cpp +++ b/indra/newview/llmediafilter.cpp @@ -101,7 +101,6 @@ void LLMediaFilter::filterAudioUrl(const std::string& url) { if (url.empty()) { - gAudiop->startInternetStream(url); return; } if (url == mCurrentAudioURL) return;