aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra
diff options
context:
space:
mode:
Diffstat (limited to 'linden/indra')
-rw-r--r--linden/indra/cmake/00-Common.cmake4
-rw-r--r--linden/indra/cmake/Python.cmake2
-rw-r--r--linden/indra/cmake/Variables.cmake16
-rwxr-xr-xlinden/indra/develop.py2
-rw-r--r--linden/indra/llcommon/llstring.h1
-rw-r--r--linden/indra/llimage/llimage.h6
-rw-r--r--linden/indra/llrender/llfontregistry.cpp10
-rw-r--r--linden/indra/llui/llnotifications.cpp4
-rw-r--r--linden/indra/llvfs/lldir_mac.cpp2
-rw-r--r--linden/indra/llvfs/llvfs.cpp5
-rw-r--r--linden/indra/llwindow/llwindowmacosx-objc.mm43
-rw-r--r--linden/indra/lscript/lscript_library/lscript_library.cpp16
-rw-r--r--linden/indra/newview/CMakeLists.txt2
-rw-r--r--linden/indra/newview/Info-Imprudence.plist2
-rw-r--r--linden/indra/newview/app_settings/settings.xml38
-rw-r--r--linden/indra/newview/app_settings/viewerversion.xml2
-rw-r--r--linden/indra/newview/floaterlocalassetbrowse.cpp4
-rw-r--r--linden/indra/newview/floaterlocalassetbrowse.h4
-rw-r--r--linden/indra/newview/impprefsfonts.cpp50
-rw-r--r--linden/indra/newview/llappviewer.cpp43
-rw-r--r--linden/indra/newview/llfeaturemanager.cpp11
-rw-r--r--linden/indra/newview/llfilepicker.cpp4
-rw-r--r--linden/indra/newview/llfloaterabout.cpp2
-rw-r--r--linden/indra/newview/llfloatergroups.cpp4
-rw-r--r--linden/indra/newview/llfloaterimagepreview.cpp12
-rw-r--r--linden/indra/newview/llfloaterpreference.cpp12
-rw-r--r--linden/indra/newview/llfloaterreporter.cpp1
-rw-r--r--linden/indra/newview/llfloatersnapshot.cpp1
-rw-r--r--linden/indra/newview/llfloaterteleporthistory.cpp16
-rw-r--r--linden/indra/newview/llfloaterteleporthistory.h3
-rw-r--r--linden/indra/newview/llfloatertools.cpp73
-rw-r--r--linden/indra/newview/llfloatertools.h1
-rw-r--r--linden/indra/newview/llgesturemgr.cpp201
-rw-r--r--linden/indra/newview/llgroupnotify.cpp1
-rw-r--r--linden/indra/newview/llimview.cpp11
-rw-r--r--linden/indra/newview/llimview.h6
-rw-r--r--linden/indra/newview/llpanelgroupgeneral.cpp15
-rw-r--r--linden/indra/newview/llprefsim.cpp32
-rw-r--r--linden/indra/newview/llselectmgr.cpp6
-rw-r--r--linden/indra/newview/llselectmgr.h1
-rw-r--r--linden/indra/newview/llstartup.cpp10
-rw-r--r--linden/indra/newview/llstartup.h3
-rw-r--r--linden/indra/newview/llviewermenufile.cpp32
-rwxr-xr-xlinden/indra/newview/llviewermessage.cpp7
-rw-r--r--linden/indra/newview/llvlcomposition.cpp12
-rw-r--r--linden/indra/newview/llvlcomposition.h2
-rw-r--r--linden/indra/newview/llwindlightremotectrl.cpp1
-rw-r--r--linden/indra/newview/panelradar.cpp4
-rw-r--r--linden/indra/newview/qtoolalign.cpp585
-rw-r--r--linden/indra/newview/qtoolalign.h50
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_teleport_history.xml6
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/floater_tools.xml20
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/fonts.xml2
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/notifications.xml33
-rw-r--r--linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml10
55 files changed, 1283 insertions, 163 deletions
diff --git a/linden/indra/cmake/00-Common.cmake b/linden/indra/cmake/00-Common.cmake
index 032a3cf..0e90073 100644
--- a/linden/indra/cmake/00-Common.cmake
+++ b/linden/indra/cmake/00-Common.cmake
@@ -186,8 +186,8 @@ if (DARWIN)
186 add_definitions(-DLL_DARWIN=1) 186 add_definitions(-DLL_DARWIN=1)
187 set(CMAKE_CXX_LINK_FLAGS "-Wl,-headerpad_max_install_names,-search_paths_first") 187 set(CMAKE_CXX_LINK_FLAGS "-Wl,-headerpad_max_install_names,-search_paths_first")
188 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_CXX_LINK_FLAGS}") 188 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
189 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mlong-branch") 189 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mlong-branch -msse3 -msse4.1 -msse4.2 -mssse3 -w")
190 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mlong-branch") 190 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mlong-branch -msse3 -msse4.1 -msse4.2 -mssse3 -w")
191 # NOTE: it's critical that the optimization flag is put in front. 191 # NOTE: it's critical that the optimization flag is put in front.
192 # NOTE: it's critical to have both CXX_FLAGS and C_FLAGS covered. 192 # NOTE: it's critical to have both CXX_FLAGS and C_FLAGS covered.
193 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O0 ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") 193 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O0 ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
diff --git a/linden/indra/cmake/Python.cmake b/linden/indra/cmake/Python.cmake
index 0901c1b..e4257f4 100644
--- a/linden/indra/cmake/Python.cmake
+++ b/linden/indra/cmake/Python.cmake
@@ -9,10 +9,12 @@ if (WINDOWS)
9 NAMES python25.exe python23.exe python.exe 9 NAMES python25.exe python23.exe python.exe
10 NO_DEFAULT_PATH # added so that cmake does not find cygwin python 10 NO_DEFAULT_PATH # added so that cmake does not find cygwin python
11 PATHS 11 PATHS
12 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.7\\InstallPath]
12 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath] 13 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath]
13 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath] 14 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath]
14 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath] 15 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath]
15 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath] 16 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath]
17 [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.7\\InstallPath]
16 [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath] 18 [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath]
17 [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath] 19 [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath]
18 [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath] 20 [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath]
diff --git a/linden/indra/cmake/Variables.cmake b/linden/indra/cmake/Variables.cmake
index 5d4dffe..8a06133 100644
--- a/linden/indra/cmake/Variables.cmake
+++ b/linden/indra/cmake/Variables.cmake
@@ -60,17 +60,11 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
60 # set this dynamically from the build system now - 60 # set this dynamically from the build system now -
61 # NOTE: wont have a distributable build unless you add this on the configure line with: 61 # NOTE: wont have a distributable build unless you add this on the configure line with:
62 # -DCMAKE_OSX_ARCHITECTURES:STRING='i386;ppc' 62 # -DCMAKE_OSX_ARCHITECTURES:STRING='i386;ppc'
63 #set(CMAKE_OSX_ARCHITECTURES i386;ppc) 63 set(CMAKE_OSX_ARCHITECTURES i386)
64 set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.4u.sdk) 64 set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.5.sdk)
65 if (CMAKE_OSX_ARCHITECTURES MATCHES "i386" AND CMAKE_OSX_ARCHITECTURES MATCHES "ppc") 65 if (CMAKE_OSX_ARCHITECTURES MATCHES "i386")
66 set(ARCH universal) 66 set(ARCH i386)
67 else (CMAKE_OSX_ARCHITECTURES MATCHES "i386" AND CMAKE_OSX_ARCHITECTURES MATCHES "ppc") 67 endif (CMAKE_OSX_ARCHITECTURES MATCHES "i386")
68 if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "ppc")
69 set(ARCH ppc)
70 else (${CMAKE_SYSTEM_PROCESSOR} MATCHES "ppc")
71 set(ARCH i386)
72 endif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "ppc")
73 endif (CMAKE_OSX_ARCHITECTURES MATCHES "i386" AND CMAKE_OSX_ARCHITECTURES MATCHES "ppc")
74 set(LL_ARCH ${ARCH}_darwin) 68 set(LL_ARCH ${ARCH}_darwin)
75 set(LL_ARCH_DIR universal-darwin) 69 set(LL_ARCH_DIR universal-darwin)
76endif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 70endif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
diff --git a/linden/indra/develop.py b/linden/indra/develop.py
index 809ac78..2ce9f91 100755
--- a/linden/indra/develop.py
+++ b/linden/indra/develop.py
@@ -421,7 +421,7 @@ class DarwinSetup(UnixSetup):
421 type=self.build_type.upper() 421 type=self.build_type.upper()
422 ) 422 )
423 if self.unattended == 'ON': 423 if self.unattended == 'ON':
424 args['universal'] = '-DCMAKE_OSX_ARCHITECTURES:STRING=\'i386;ppc\'' 424 args['universal'] = '-DCMAKE_OSX_ARCHITECTURES:STRING=\'i386\''
425 #if simple: 425 #if simple:
426 # return 'cmake %(opts)s %(dir)r' % args 426 # return 'cmake %(opts)s %(dir)r' % args
427 return ('cmake -G %(generator)r ' 427 return ('cmake -G %(generator)r '
diff --git a/linden/indra/llcommon/llstring.h b/linden/indra/llcommon/llstring.h
index 7db62bc..3c6cd43 100644
--- a/linden/indra/llcommon/llstring.h
+++ b/linden/indra/llcommon/llstring.h
@@ -870,6 +870,7 @@ void LLStringUtilBase<T>::addCRLF(std::basic_string<T>& string)
870 } 870 }
871 871
872 string.assign(t, size); 872 string.assign(t, size);
873 delete[] t;
873 } 874 }
874} 875}
875 876
diff --git a/linden/indra/llimage/llimage.h b/linden/indra/llimage/llimage.h
index 2bc62fb..fd8d128 100644
--- a/linden/indra/llimage/llimage.h
+++ b/linden/indra/llimage/llimage.h
@@ -73,7 +73,13 @@ typedef enum e_image_codec
73 IMG_CODEC_JPEG = 5, 73 IMG_CODEC_JPEG = 5,
74 IMG_CODEC_DXT = 6, 74 IMG_CODEC_DXT = 6,
75 IMG_CODEC_PNG = 7, 75 IMG_CODEC_PNG = 7,
76#ifdef LL_DARWIN
77 IMG_CODEC_PSD = 8,
78 IMG_CODEC_TIFF = 9,
79 IMG_CODEC_EOF = 10
80#else
76 IMG_CODEC_EOF = 8 81 IMG_CODEC_EOF = 8
82#endif
77} EImageCodec; 83} EImageCodec;
78 84
79//============================================================================ 85//============================================================================
diff --git a/linden/indra/llrender/llfontregistry.cpp b/linden/indra/llrender/llfontregistry.cpp
index 9792a91..c5923cd 100644
--- a/linden/indra/llrender/llfontregistry.cpp
+++ b/linden/indra/llrender/llfontregistry.cpp
@@ -442,7 +442,15 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc)
442 std::string font_path = local_path + *file_name_it; 442 std::string font_path = local_path + *file_name_it;
443 BOOL is_fallback = !is_first_found; 443 BOOL is_fallback = !is_first_found;
444 F32 size_mult = (is_fallback ? 1 : match_desc->getSizeMult()); 444 F32 size_mult = (is_fallback ? 1 : match_desc->getSizeMult());
445 F32 size = (F32)llround(point_size * size_mult); 445 if (gSavedSettings.getF32("FontSizeMultiplier") > 0)
446 {
447 size_mult *= gSavedSettings.getF32("FontSizeMultiplier");
448 }
449 F32 size = (F32)(point_size * size_mult);
450 if (gSavedSettings.getBOOL("FontSizeRounding"))
451 {
452 size = (F32)llround(size);
453 }
446 if (!fontp->loadFace(font_path, size, 454 if (!fontp->loadFace(font_path, size,
447 LLFontGL::sVertDPI, LLFontGL::sHorizDPI, 2, is_fallback)) 455 LLFontGL::sVertDPI, LLFontGL::sHorizDPI, 2, is_fallback))
448 { 456 {
diff --git a/linden/indra/llui/llnotifications.cpp b/linden/indra/llui/llnotifications.cpp
index 2459110..4d3ff46 100644
--- a/linden/indra/llui/llnotifications.cpp
+++ b/linden/indra/llui/llnotifications.cpp
@@ -1190,13 +1190,13 @@ void replaceSubstitutionStrings(LLXMLNodePtr node, StringMap& replacements)
1190 if (found != replacements.end()) 1190 if (found != replacements.end())
1191 { 1191 {
1192 replacement = found->second; 1192 replacement = found->second;
1193 //llwarns << "replaceSubstituionStrings: value: " << value << " repl: " << replacement << llendl; 1193 //llinfos << "replaceSubstitutionStrings: value: \"" << value << "\" repl: \"" << replacement << "\"." << llendl;
1194 1194
1195 it->second->setValue(replacement); 1195 it->second->setValue(replacement);
1196 } 1196 }
1197 else 1197 else
1198 { 1198 {
1199 llwarns << "replaceSubstituionStrings FAILURE: value: " << value << " repl: " << replacement << llendl; 1199 llwarns << "replaceSubstitutionStrings FAILURE: could not find replacement \"" << value << "\"." << llendl;
1200 } 1200 }
1201 } 1201 }
1202 } 1202 }
diff --git a/linden/indra/llvfs/lldir_mac.cpp b/linden/indra/llvfs/lldir_mac.cpp
index 6d5dcf3..b2d9787 100644
--- a/linden/indra/llvfs/lldir_mac.cpp
+++ b/linden/indra/llvfs/lldir_mac.cpp
@@ -173,7 +173,7 @@ LLDir_Mac::LLDir_Mac()
173 if (error == noErr) 173 if (error == noErr)
174 { 174 {
175 FSRefToLLString(&cacheDirRef, mOSCacheDir); 175 FSRefToLLString(&cacheDirRef, mOSCacheDir);
176 (void)CFCreateDirectory(&cacheDirRef, CFSTR("Imprudence"),NULL); 176 (void)CFCreateDirectory(&cacheDirRef, CFSTR("ImprudenceExperimental"),NULL);
177 } 177 }
178 178
179 // mOSUserAppDir 179 // mOSUserAppDir
diff --git a/linden/indra/llvfs/llvfs.cpp b/linden/indra/llvfs/llvfs.cpp
index 7df2a81..9bf5b59 100644
--- a/linden/indra/llvfs/llvfs.cpp
+++ b/linden/indra/llvfs/llvfs.cpp
@@ -583,8 +583,9 @@ LLVFS::LLVFS(const std::string& index_filename, const std::string& data_filename
583 } 583 }
584 } 584 }
585 585
586 LL_WARNS("VFS") << "Using index file " << mIndexFilename << LL_ENDL; 586 // Success!
587 LL_WARNS("VFS") << "Using data file " << mDataFilename << LL_ENDL; 587 LL_INFOS("VFS") << "Using index file " << mIndexFilename << LL_ENDL;
588 LL_INFOS("VFS") << "Using data file " << mDataFilename << LL_ENDL;
588 589
589 mValid = VFSVALID_OK; 590 mValid = VFSVALID_OK;
590} 591}
diff --git a/linden/indra/llwindow/llwindowmacosx-objc.mm b/linden/indra/llwindow/llwindowmacosx-objc.mm
index 5f33764..abe8c5d 100644
--- a/linden/indra/llwindow/llwindowmacosx-objc.mm
+++ b/linden/indra/llwindow/llwindowmacosx-objc.mm
@@ -58,29 +58,44 @@ BOOL decodeImageQuartz(const UInt8* data, int len, LLImageRaw *raw_image)
58 UInt8* bitmap = (UInt8*)CFDataGetBytePtr(result); 58 UInt8* bitmap = (UInt8*)CFDataGetBytePtr(result);
59 59
60 CGImageAlphaInfo format = CGImageGetAlphaInfo(image_ref); 60 CGImageAlphaInfo format = CGImageGetAlphaInfo(image_ref);
61 if (format & kCGImageAlphaPremultipliedFirst) 61 if (format != kCGImageAlphaNone)
62 { 62 {
63 vImage_Buffer vb; 63 vImage_Buffer vb;
64 vb.data = bitmap; 64 vb.data = bitmap;
65 vb.height = height; 65 vb.height = height;
66 vb.width = width; 66 vb.width = width;
67 vb.rowBytes = bytes_per_row; 67 vb.rowBytes = bytes_per_row;
68 llinfos << "Unpremultiplying ARGB888" << llendl; 68
69 vImageUnpremultiplyData_ARGB8888(&vb, &vb, 0); 69 if (format & kCGImageAlphaPremultipliedFirst)
70 } 70 {
71 else if (format & kCGImageAlphaPremultipliedLast) 71 // Ele: ARGB -> BGRA on Intel, need to first reorder the bytes, then unpremultiply as RGBA :)
72 { 72 llinfos << "Unpremultiplying BGRA8888" << llendl;
73 vImage_Buffer vb; 73
74 vb.data = bitmap; 74 for (int i=0; i<height; i++)
75 vb.height = height; 75 {
76 vb.width = width; 76 for (int j=0; j<bytes_per_row; j+=4)
77 vb.rowBytes = bytes_per_row; 77 {
78 llinfos << "Unpremultiplying RGBA888" << llendl; 78 unsigned char tmp[4];
79 vImageUnpremultiplyData_RGBA8888(&vb, &vb, 0); 79
80 tmp[0] = bitmap[j*height+3];
81 tmp[1] = bitmap[j*height+2];
82 tmp[2] = bitmap[j*height+1];
83 tmp[3] = bitmap[j*height];
84
85 memcpy(&bitmap[j*height], &tmp, 4);
86 }
87 }
88
89 vImageUnpremultiplyData_RGBA8888(&vb, &vb, 0);
90 }
91 else if (format & kCGImageAlphaPremultipliedLast)
92 {
93 llinfos << "Unpremultiplying RGBA8888" << llendl;
94 vImageUnpremultiplyData_RGBA8888(&vb, &vb, 0);
95 }
80 } 96 }
81 97
82 raw_image->resize(width, height, comps); 98 raw_image->resize(width, height, comps);
83 llinfos << "Decoding an image of width: " << width << " and height: " << height << " and components: " << comps << llendl;
84 memcpy(raw_image->getData(), bitmap, height * bytes_per_row); 99 memcpy(raw_image->getData(), bitmap, height * bytes_per_row);
85 raw_image->verticalFlip(); 100 raw_image->verticalFlip();
86 101
diff --git a/linden/indra/lscript/lscript_library/lscript_library.cpp b/linden/indra/lscript/lscript_library/lscript_library.cpp
index 68daa50..cc56119 100644
--- a/linden/indra/lscript/lscript_library/lscript_library.cpp
+++ b/linden/indra/lscript/lscript_library/lscript_library.cpp
@@ -484,8 +484,9 @@ void LLScriptLibrary::init()
484 // documented and therefore the description may be incomplete and require further attention. 484 // documented and therefore the description may be incomplete and require further attention.
485 // OpenSimulator is written in C# and not CPP therefore some values for example "double = float" etc. are different. 485 // OpenSimulator is written in C# and not CPP therefore some values for example "double = float" etc. are different.
486 486
487 // OSSL corrections and syntax additions added + set in same order as found in OSSL_stub.cs of OpenSim Source (February 19, 2010) 487 // OSSL corrections and syntax additions added + set in same order as found in OSSL_stub.cs of OpenSim Source (Updated PM October-21-2010
488 // based on OpenSimulator Ver. 0.6.9 DEV Git # af265e001d3bf043590e480cd6574a14193f6de0 - Rev 12239 488 // based on OpenSimulator Ver. 0.7.x DEV/Master Git # a7acb650d400a280a7b9edabd304376dff9c81af - a7acb65-r/14142
489 // Updates by WhiteStar Magic
489 490
490 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osSetRegionWaterHeight", NULL, "f", "osSetRegionWaterHeight(float height)\nAdjusts Water Height on region.\n(OpenSim only.)")); 491 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osSetRegionWaterHeight", NULL, "f", "osSetRegionWaterHeight(float height)\nAdjusts Water Height on region.\n(OpenSim only.)"));
491 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osSetRegionSunSettings", NULL, "iif", "osSetRegionSunSettings(integer useEstateSun, integer sunFixed, float sunHour)\nChanges the Estate Sun Settings, then Triggers a Sun Update\n'sunFixed' TRUE (1) to keep the sun stationary, FALSE (0) to use global time\n'sunHour' The \"Sun Hour\" that is desired, 0...24, with 0 just after SunRise.\n(OpenSim only.)")); 492 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osSetRegionSunSettings", NULL, "iif", "osSetRegionSunSettings(integer useEstateSun, integer sunFixed, float sunHour)\nChanges the Estate Sun Settings, then Triggers a Sun Update\n'sunFixed' TRUE (1) to keep the sun stationary, FALSE (0) to use global time\n'sunHour' The \"Sun Hour\" that is desired, 0...24, with 0 just after SunRise.\n(OpenSim only.)"));
@@ -494,8 +495,11 @@ void LLScriptLibrary::init()
494 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osSunGetParam","f", "s", "float osSunGetParam(string param)\nReturns current float values for param\nwhere param = day_length, year_length, day_night_offset, update_interval.\n(OpenSim only.)")); 495 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osSunGetParam","f", "s", "float osSunGetParam(string param)\nReturns current float values for param\nwhere param = day_length, year_length, day_night_offset, update_interval.\n(OpenSim only.)"));
495 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osSunSetParam", "sf", NULL, "osSunSetParam(string param, float value)\nSet's Sun Param for SunSet,\nosSunSetParam(day_length, 24.0)\nwhere param = day_length, year_length, day_night_offset, update_interval.\n(OpenSim only.)")); 496 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osSunSetParam", "sf", NULL, "osSunSetParam(string param, float value)\nSet's Sun Param for SunSet,\nosSunSetParam(day_length, 24.0)\nwhere param = day_length, year_length, day_night_offset, update_interval.\n(OpenSim only.)"));
496 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osWindActiveModelPluginName", "s", NULL, "string osWindActiveModelPluginName()\nReturns the Current Working Wind Module Installed\nThese are SimpleRandomWind or ConfigurableWind, optionally others.\n(OpenSim only.)")); 497 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osWindActiveModelPluginName", "s", NULL, "string osWindActiveModelPluginName()\nReturns the Current Working Wind Module Installed\nThese are SimpleRandomWind or ConfigurableWind, optionally others.\n(OpenSim only.)"));
497 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osWindParamSet", NULL, "ssf", "osWindParamSet(string plugin, string param, float value)Send Param to Specified Wind Plugin with new value.\n(OpenSim only.)")); 498 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osParcelJoin", NULL, "vv", "osParcelJoin(vector pos1, vector pos2))\nJoins Parcels @ X,Y coordinates.\n(OpenSim only.)"));
498 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osWindParamGet", "f", "ss", "float osWindParamGet(string plugin, string param)\n Returns Current param from specified Wind Plugin Module.\n(OpenSim only.)")); 499 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osParcelSubdivide", NULL, "vv", "osParcelSubdivide(vector pos1, vector pos2))\nSubdivides Parcels @ X,Y coordinates.\n(OpenSim only.)"));
500 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osParcelSetDetails", NULL, "vv", "osParcelSetDetails(vector pos, list rules))\nSet Parcel details.\n(OpenSim only.)"));
501 // addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osWindParamSet", NULL, "ssf", "osWindParamSet(string plugin, string param, float value)Send Param to Specified Wind Plugin with new value.\n(OpenSim only.)"));
502 // addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osWindParamGet", "f", "ss", "float osWindParamGet(string plugin, string param)\n Returns Current param from specified Wind Plugin Module.\n(OpenSim only.)"));
499 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osList2Double", "f", "si", "double osList2Double(list src, int index)\nReturns Double (float) Value from src at index.\n(OpenSim only.)")); 503 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osList2Double", "f", "si", "double osList2Double(list src, int index)\nReturns Double (float) Value from src at index.\n(OpenSim only.)"));
500 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osSetDynamicTextureURL", NULL, "ssssi", "osSetDynamicTextureURL(string dynamicID, string contentType, string url, string extraParams, int timer )\n(OpenSim only.)")); 504 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osSetDynamicTextureURL", NULL, "ssssi", "osSetDynamicTextureURL(string dynamicID, string contentType, string url, string extraParams, int timer )\n(OpenSim only.)"));
501 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osSetDynamicTextureData", NULL, "ssssi", "osSetDynamicTextureData(string dynamicID, string contentType, string data, string extraParams, int timer)\nWrites text and vector graphics onto a prim face.\n(OpenSim only.)")); 505 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osSetDynamicTextureData", NULL, "ssssi", "osSetDynamicTextureData(string dynamicID, string contentType, string data, string extraParams, int timer)\nWrites text and vector graphics onto a prim face.\n(OpenSim only.)"));
@@ -564,7 +568,9 @@ void LLScriptLibrary::init()
564 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osSetSpeed", NULL, "kf", "osSetSpeed(key AVATAR, float SpeedModifier)\nMultiplies the normal running, walking, and flying speed of the specified avatar.\n(OpenSim only.)")); 568 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osSetSpeed", NULL, "kf", "osSetSpeed(key AVATAR, float SpeedModifier)\nMultiplies the normal running, walking, and flying speed of the specified avatar.\n(OpenSim only.)"));
565 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osCauseDamage", NULL, "kf", "osCauseDamage(key AVATAR, float damage)\nCauses damage to specified AVATAR (UUID).\n(OpenSim only.)")); 569 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osCauseDamage", NULL, "kf", "osCauseDamage(key AVATAR, float damage)\nCauses damage to specified AVATAR (UUID).\n(OpenSim only.)"));
566 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osCauseHealing", NULL, "kf", "osCauseHealing(key AVATAR, float healing)\nCauses Healing to specified AVATAR (UUID).\n(OpenSim only.)")); 570 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osCauseHealing", NULL, "kf", "osCauseHealing(key AVATAR, float healing)\nCauses Healing to specified AVATAR (UUID).\n(OpenSim only.)"));
567 571 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osGetPrimitiveParams", "l", "kl", "List osGetPrimitiveParams(key prim, list rules)\nGets primitive Params.\n(OpenSim only.)"));
572 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osSetPrimitiveParams", NULL, "kl", "osSetPrimitiveParams(key prim, list rules)\nSets primitive Params.\n(OpenSim only.)"));
573 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "osSetProjectionParams", NULL, "kikfff", "osSetProjectionParams(key prim. bool projection, key texture, float fov, float focus, float amb)\nSet Projection Paramaters (bool = true / false)\n(OpenSim only.)"));
568 574
569 // LightShare functions 575 // LightShare functions
570 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "cmSetWindlightScene", "i", "l", "integer cmSetWindlightScene(list rules)\nSet the current WindLight scene. Restricted to estate managers and owners only.")); 576 addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "cmSetWindlightScene", "i", "l", "integer cmSetWindlightScene(list rules)\nSet the current WindLight scene. Restricted to estate managers and owners only."));
diff --git a/linden/indra/newview/CMakeLists.txt b/linden/indra/newview/CMakeLists.txt
index dfd35bf..1a6ad30 100644
--- a/linden/indra/newview/CMakeLists.txt
+++ b/linden/indra/newview/CMakeLists.txt
@@ -484,6 +484,7 @@ set(viewer_SOURCE_FILES
484 panelradarentry.cpp 484 panelradarentry.cpp
485 pipeline.cpp 485 pipeline.cpp
486 primbackup.cpp 486 primbackup.cpp
487 qtoolalign.cpp
487 rlvhandler.cpp 488 rlvhandler.cpp
488 rlvhelper.cpp 489 rlvhelper.cpp
489 rlvcommon.cpp 490 rlvcommon.cpp
@@ -936,6 +937,7 @@ set(viewer_HEADER_FILES
936 panelradarentry.h 937 panelradarentry.h
937 pipeline.h 938 pipeline.h
938 primbackup.h 939 primbackup.h
940 qtoolalign.h
939 randgauss.h 941 randgauss.h
940 rlvdefines.h 942 rlvdefines.h
941 rlvhandler.h 943 rlvhandler.h
diff --git a/linden/indra/newview/Info-Imprudence.plist b/linden/indra/newview/Info-Imprudence.plist
index 419cacd..3fe2000 100644
--- a/linden/indra/newview/Info-Imprudence.plist
+++ b/linden/indra/newview/Info-Imprudence.plist
@@ -32,7 +32,7 @@
32 </dict> 32 </dict>
33 </array> 33 </array>
34 <key>CFBundleVersion</key> 34 <key>CFBundleVersion</key>
35 <string>Experimental 2010.09.04</string> 35 <string>Experimental 2010.10.17</string>
36 <key>CSResourcesFileMapped</key> 36 <key>CSResourcesFileMapped</key>
37 <true/> 37 <true/>
38</dict> 38</dict>
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index 3be4ed4..7b37bb6 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -4,6 +4,8 @@
4 4
5 <!-- Imprudence-specific settings --> 5 <!-- Imprudence-specific settings -->
6 6
7 <!-- begin name highlighting -->
8
7 <key>nick01</key> 9 <key>nick01</key>
8 <map> 10 <map>
9 <key>Comment</key> 11 <key>Comment</key>
@@ -102,6 +104,9 @@
102 <real>1</real> 104 <real>1</real>
103 </array> 105 </array>
104 </map> 106 </map>
107
108 <!-- end name highlighting -->
109
105 <key>AllowMUpose</key> 110 <key>AllowMUpose</key>
106 <map> 111 <map>
107 <key>Comment</key> 112 <key>Comment</key>
@@ -289,6 +294,17 @@
289 <key>Value</key> 294 <key>Value</key>
290 <integer>1</integer> 295 <integer>1</integer>
291 </map> 296 </map>
297 <key>FetchInventoryOnLogin</key>
298 <map>
299 <key>Comment</key>
300 <string>Automatically fetch the inventory in the background after login (has issues)</string>
301 <key>Persist</key>
302 <integer>1</integer>
303 <key>Type</key>
304 <string>Boolean</string>
305 <key>Value</key>
306 <integer>0</integer>
307 </map>
292 <key>FloaterAnimationListRect</key> 308 <key>FloaterAnimationListRect</key>
293 <map> 309 <map>
294 <key>Comment</key> 310 <key>Comment</key>
@@ -380,6 +396,28 @@
380 <key>Value</key> 396 <key>Value</key>
381 <string>DroidSans</string> 397 <string>DroidSans</string>
382 </map> 398 </map>
399 <key>FontSizeMultiplier</key>
400 <map>
401 <key>Comment</key>
402 <string>Multiply all font sizes by this amount. Requires viewer restart.</string>
403 <key>Persist</key>
404 <integer>1</integer>
405 <key>Type</key>
406 <string>F32</string>
407 <key>Value</key>
408 <string>1.0</string>
409 </map>
410 <key>FontSizeRounding</key>
411 <map>
412 <key>Comment</key>
413 <string>Round all font sizes to integer values, to potentially reduce font blurriness. The rounding occurs after FontSizeMultiplier is applied. Requires viewer restart.</string>
414 <key>Persist</key>
415 <integer>1</integer>
416 <key>Type</key>
417 <string>Boolean</string>
418 <key>Value</key>
419 <integer>0</integer>
420 </map>
383 <key>GoAction</key> 421 <key>GoAction</key>
384 <map> 422 <map>
385 <key>Comment</key> 423 <key>Comment</key>
diff --git a/linden/indra/newview/app_settings/viewerversion.xml b/linden/indra/newview/app_settings/viewerversion.xml
index 2745845..f50b594 100644
--- a/linden/indra/newview/app_settings/viewerversion.xml
+++ b/linden/indra/newview/app_settings/viewerversion.xml
@@ -20,6 +20,6 @@ need to be changed manually - MC
20 <viewer version_patch="0" /> 20 <viewer version_patch="0" />
21 21
22 <!--string--> 22 <!--string-->
23 <viewer version_test="Experimental 2010.10.09" /> 23 <viewer version_test="Experimental 2010.10.17" />
24 24
25</viewer_version> 25</viewer_version>
diff --git a/linden/indra/newview/floaterlocalassetbrowse.cpp b/linden/indra/newview/floaterlocalassetbrowse.cpp
index 443b5bf..991d2fd 100644
--- a/linden/indra/newview/floaterlocalassetbrowse.cpp
+++ b/linden/indra/newview/floaterlocalassetbrowse.cpp
@@ -119,6 +119,10 @@ LocalBitmap::LocalBitmap(std::string fullpath)
119 else if (temp_exten == "tga") { this->extension = IMG_EXTEN_TGA; } 119 else if (temp_exten == "tga") { this->extension = IMG_EXTEN_TGA; }
120 else if (temp_exten == "jpg" || temp_exten == "jpeg") { this->extension = IMG_EXTEN_JPG; } 120 else if (temp_exten == "jpg" || temp_exten == "jpeg") { this->extension = IMG_EXTEN_JPG; }
121 else if (temp_exten == "png") { this->extension = IMG_EXTEN_PNG; } 121 else if (temp_exten == "png") { this->extension = IMG_EXTEN_PNG; }
122#ifdef LL_DARWIN
123 else if (temp_exten == "psd") { this->extension = IMG_EXTEN_PSD; }
124 else if (temp_exten == "tif" || temp_exten == "tiff") { this->extension = IMG_EXTEN_TIFF; }
125#endif
122 else { return; } // no valid extension. 126 else { return; } // no valid extension.
123 127
124 /* getting file's last modified */ 128 /* getting file's last modified */
diff --git a/linden/indra/newview/floaterlocalassetbrowse.h b/linden/indra/newview/floaterlocalassetbrowse.h
index e02a7d3..69afe98 100644
--- a/linden/indra/newview/floaterlocalassetbrowse.h
+++ b/linden/indra/newview/floaterlocalassetbrowse.h
@@ -114,6 +114,10 @@ class LocalBitmap
114 IMG_EXTEN_TGA, 114 IMG_EXTEN_TGA,
115 IMG_EXTEN_JPG, 115 IMG_EXTEN_JPG,
116 IMG_EXTEN_PNG 116 IMG_EXTEN_PNG
117#ifdef LL_DARWIN
118 ,IMG_EXTEN_PSD,
119 IMG_EXTEN_TIFF
120#endif
117 }; 121 };
118 122
119 enum bitmap_type 123 enum bitmap_type
diff --git a/linden/indra/newview/impprefsfonts.cpp b/linden/indra/newview/impprefsfonts.cpp
index 3ce71eb..a4dcd34 100644
--- a/linden/indra/newview/impprefsfonts.cpp
+++ b/linden/indra/newview/impprefsfonts.cpp
@@ -29,7 +29,9 @@
29#include "llviewerprecompiledheaders.h" 29#include "llviewerprecompiledheaders.h"
30#include "impprefsfonts.h" 30#include "impprefsfonts.h"
31 31
32#include "llcheckboxctrl.h"
32#include "llradiogroup.h" 33#include "llradiogroup.h"
34#include "llspinctrl.h"
33#include "lluictrlfactory.h" 35#include "lluictrlfactory.h"
34 36
35#include "llviewercontrol.h" 37#include "llviewercontrol.h"
@@ -61,24 +63,64 @@ void ImpPrefsFonts::refresh()
61 { 63 {
62 fonts->setValue( gSavedSettings.getString("FontChoice") ); 64 fonts->setValue( gSavedSettings.getString("FontChoice") );
63 } 65 }
66
67 LLSpinCtrl* font_mult = getChild<LLSpinCtrl>("font_mult");
68 if (font_mult)
69 {
70 font_mult->setValue( gSavedSettings.getF32("FontSizeMultiplier") );
71 }
72
73 LLCheckBoxCtrl* font_round = getChild<LLCheckBoxCtrl>("font_round");
74 if (font_round)
75 {
76 font_round->setValue( gSavedSettings.getBOOL("FontSizeRounding") );
77 }
64} 78}
65 79
66void ImpPrefsFonts::apply() 80void ImpPrefsFonts::apply()
67{ 81{
68 LLRadioGroup* fonts = getChild<LLRadioGroup>("fonts"); 82 bool changed = false;
69 83
84 LLRadioGroup* fonts = getChild<LLRadioGroup>("fonts");
70 if (fonts) 85 if (fonts)
71 { 86 {
72 std::string font_choice = fonts->getValue().asString(); 87 std::string font_choice = fonts->getValue().asString();
73
74 if (font_choice != gSavedSettings.getString("FontChoice") && 88 if (font_choice != gSavedSettings.getString("FontChoice") &&
75 !font_choice.empty()) 89 !font_choice.empty())
76 { 90 {
77 gSavedSettings.setString("FontChoice", font_choice); 91 gSavedSettings.setString("FontChoice", font_choice);
78 LLNotifications::instance().add("ChangeFont"); 92 changed = true;
79 refresh();
80 } 93 }
81 } 94 }
95
96 LLSpinCtrl* font_mult = getChild<LLSpinCtrl>("font_mult");
97 if (font_mult)
98 {
99 F32 mult = font_mult->getValue().asReal();
100 if (mult != gSavedSettings.getF32("FontSizeMultiplier"))
101 {
102 gSavedSettings.setF32("FontSizeMultiplier", mult);
103 changed = true;
104 }
105 }
106
107 LLCheckBoxCtrl* font_round = getChild<LLCheckBoxCtrl>("font_round");
108 if (font_round)
109 {
110 BOOL round = font_round->getValue().asBoolean();
111 if (round != gSavedSettings.getBOOL("FontSizeRounding"))
112 {
113 gSavedSettings.setBOOL("FontSizeRounding", round);
114 changed = true;
115 }
116 }
117
118 if (changed)
119 {
120 refresh();
121 LLNotifications::instance().add("ChangeFont");
122 }
123
82} 124}
83 125
84void ImpPrefsFonts::cancel() 126void ImpPrefsFonts::cancel()
diff --git a/linden/indra/newview/llappviewer.cpp b/linden/indra/newview/llappviewer.cpp
index 4806dda..4485cdf 100644
--- a/linden/indra/newview/llappviewer.cpp
+++ b/linden/indra/newview/llappviewer.cpp
@@ -440,8 +440,6 @@ static void settings_to_globals()
440 gMapScale = gSavedSettings.getF32("MapScale"); 440 gMapScale = gSavedSettings.getF32("MapScale");
441 LLHoverView::sShowHoverTips = gSavedSettings.getBOOL("ShowHoverTips"); 441 LLHoverView::sShowHoverTips = gSavedSettings.getBOOL("ShowHoverTips");
442 442
443 LLCubeMap::sUseCubeMaps = LLFeatureManager::getInstance()->isFeatureAvailable("RenderCubeMap");
444
445 LLSlider::setScrollWheelMultiplier( gSavedSettings.getS32("SliderScrollWheelMultiplier") ); 443 LLSlider::setScrollWheelMultiplier( gSavedSettings.getS32("SliderScrollWheelMultiplier") );
446 444
447 LLHUDEffectLookAt::sDebugLookAt = gSavedSettings.getBOOL("PersistShowLookAt"); 445 LLHUDEffectLookAt::sDebugLookAt = gSavedSettings.getBOOL("PersistShowLookAt");
@@ -779,6 +777,9 @@ bool LLAppViewer::init()
779 // 777 //
780 initWindow(); 778 initWindow();
781 779
780 // initWindow also initializes the Feature List, so now we can initialize this global.
781 LLCubeMap::sUseCubeMaps = LLFeatureManager::getInstance()->isFeatureAvailable("RenderCubeMap");
782
782 { 783 {
783 BOOL download = gSavedSettings.getBOOL("DownloadClientTags"); 784 BOOL download = gSavedSettings.getBOOL("DownloadClientTags");
784 785
@@ -1174,16 +1175,6 @@ bool LLAppViewer::mainLoop()
1174 1175
1175bool LLAppViewer::cleanup() 1176bool LLAppViewer::cleanup()
1176{ 1177{
1177 //----------------------------------------------
1178 //this test code will be removed after the test
1179 //test manual call stack tracer
1180 if(gSavedSettings.getBOOL("QAMode"))
1181 {
1182 LLError::LLCallStacks::print() ;
1183 }
1184 //end of the test code
1185 //----------------------------------------------
1186
1187 //flag all elements as needing to be destroyed immediately 1178 //flag all elements as needing to be destroyed immediately
1188 // to ensure shutdown order 1179 // to ensure shutdown order
1189 LLMortician::setZealous(TRUE); 1180 LLMortician::setZealous(TRUE);
@@ -2704,35 +2695,32 @@ void LLAppViewer::initMarkerFile()
2704 std::string llerror_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, LLERROR_MARKER_FILE_NAME); 2695 std::string llerror_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, LLERROR_MARKER_FILE_NAME);
2705 std::string error_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ERROR_MARKER_FILE_NAME); 2696 std::string error_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ERROR_MARKER_FILE_NAME);
2706 2697
2707
2708 if (LLAPRFile::isExist(mMarkerFileName, LL_APR_RB) && !anotherInstanceRunning()) 2698 if (LLAPRFile::isExist(mMarkerFileName, LL_APR_RB) && !anotherInstanceRunning())
2709 { 2699 {
2710 gLastExecEvent = LAST_EXEC_FROZE; 2700 gLastExecEvent = LAST_EXEC_FROZE;
2711 LL_INFOS("MarkerFile") << "Exec marker found: program froze on previous execution" << LL_ENDL; 2701 LL_INFOS("MarkerFile") << "Exec marker found: program froze on previous execution" << LL_ENDL;
2712 } 2702 }
2713
2714 if(LLAPRFile::isExist(logout_marker_file, LL_APR_RB)) 2703 if(LLAPRFile::isExist(logout_marker_file, LL_APR_RB))
2715 { 2704 {
2716 LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << LAST_EXEC_LLERROR_CRASH << LL_ENDL;
2717 gLastExecEvent = LAST_EXEC_LOGOUT_FROZE; 2705 gLastExecEvent = LAST_EXEC_LOGOUT_FROZE;
2706 LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL;
2707 LLAPRFile::remove(logout_marker_file);
2718 } 2708 }
2719 if(LLAPRFile::isExist(llerror_marker_file, LL_APR_RB)) 2709 if(LLAPRFile::isExist(llerror_marker_file, LL_APR_RB))
2720 { 2710 {
2721 llinfos << "Last exec LLError crashed, setting LastExecEvent to " << LAST_EXEC_LLERROR_CRASH << llendl;
2722 if(gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) gLastExecEvent = LAST_EXEC_LOGOUT_CRASH; 2711 if(gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) gLastExecEvent = LAST_EXEC_LOGOUT_CRASH;
2723 else gLastExecEvent = LAST_EXEC_LLERROR_CRASH; 2712 else gLastExecEvent = LAST_EXEC_LLERROR_CRASH;
2713 LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL;
2714 LLAPRFile::remove(llerror_marker_file);
2724 } 2715 }
2725 if(LLAPRFile::isExist(error_marker_file, LL_APR_RB)) 2716 if(LLAPRFile::isExist(error_marker_file, LL_APR_RB))
2726 { 2717 {
2727 LL_INFOS("MarkerFile") << "Last exec crashed, setting LastExecEvent to " << LAST_EXEC_OTHER_CRASH << LL_ENDL;
2728 if(gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) gLastExecEvent = LAST_EXEC_LOGOUT_CRASH; 2718 if(gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) gLastExecEvent = LAST_EXEC_LOGOUT_CRASH;
2729 else gLastExecEvent = LAST_EXEC_OTHER_CRASH; 2719 else gLastExecEvent = LAST_EXEC_OTHER_CRASH;
2720 LL_INFOS("MarkerFile") << "Last exec crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL;
2721 LLAPRFile::remove(error_marker_file);
2730 } 2722 }
2731 2723
2732 LLAPRFile::remove(logout_marker_file);
2733 LLAPRFile::remove(llerror_marker_file);
2734 LLAPRFile::remove(error_marker_file);
2735
2736 // No new markers if another instance is running. 2724 // No new markers if another instance is running.
2737 if(anotherInstanceRunning()) 2725 if(anotherInstanceRunning())
2738 { 2726 {
@@ -2790,7 +2778,9 @@ void LLAppViewer::forceQuit()
2790 2778
2791 LL_INFOS("forceQuit") << "Destroying the entire world" << LL_ENDL; 2779 LL_INFOS("forceQuit") << "Destroying the entire world" << LL_ENDL;
2792 if (mQuitRequested) 2780 if (mQuitRequested)
2793 LLApp::setQuitting(); 2781 {
2782 LLApp::setQuitting();
2783 }
2794 else 2784 else
2795 { 2785 {
2796 if (mLogoutRequested) //we just finished a logout request 2786 if (mLogoutRequested) //we just finished a logout request
@@ -3750,15 +3740,6 @@ void LLAppViewer::idleShutdown()
3750 forceQuit(); 3740 forceQuit();
3751 } 3741 }
3752 3742
3753
3754 static bool saved_snapshot = false;
3755 if (!saved_snapshot)
3756 {
3757 saved_snapshot = true;
3758 saveFinalSnapshot();
3759 return;
3760 }
3761
3762 // Attempt to close all floaters that might be 3743 // Attempt to close all floaters that might be
3763 // editing things. 3744 // editing things.
3764 if (gFloaterView) 3745 if (gFloaterView)
diff --git a/linden/indra/newview/llfeaturemanager.cpp b/linden/indra/newview/llfeaturemanager.cpp
index 35613b7..54da31b 100644
--- a/linden/indra/newview/llfeaturemanager.cpp
+++ b/linden/indra/newview/llfeaturemanager.cpp
@@ -250,11 +250,9 @@ BOOL LLFeatureManager::loadFeatureTables()
250 mTableVersion = version; 250 mTableVersion = version;
251 251
252 LLFeatureList *flp = NULL; 252 LLFeatureList *flp = NULL;
253 while (!file.eof() && file.good()) 253 while (file >> name)
254 { 254 {
255 char buffer[MAX_STRING]; /*Flawfinder: ignore*/ 255 char buffer[MAX_STRING]; /*Flawfinder: ignore*/
256
257 file >> name;
258 256
259 if (name.substr(0,2) == "//") 257 if (name.substr(0,2) == "//")
260 { 258 {
@@ -263,13 +261,6 @@ BOOL LLFeatureManager::loadFeatureTables()
263 continue; 261 continue;
264 } 262 }
265 263
266 if (name.empty())
267 {
268 // This is a blank line
269 file.getline(buffer, MAX_STRING);
270 continue;
271 }
272
273 if (name == "list") 264 if (name == "list")
274 { 265 {
275 if (flp) 266 if (flp)
diff --git a/linden/indra/newview/llfilepicker.cpp b/linden/indra/newview/llfilepicker.cpp
index 40b1abb..a59fa06 100644
--- a/linden/indra/newview/llfilepicker.cpp
+++ b/linden/indra/newview/llfilepicker.cpp
@@ -532,12 +532,16 @@ Boolean LLFilePicker::navOpenFilterProc(AEDesc *theItem, void *info, void *callB
532 { 532 {
533 if (fileInfo.filetype != 'JPEG' && fileInfo.filetype != 'JPG ' && 533 if (fileInfo.filetype != 'JPEG' && fileInfo.filetype != 'JPG ' &&
534 fileInfo.filetype != 'BMP ' && fileInfo.filetype != 'TGA ' && 534 fileInfo.filetype != 'BMP ' && fileInfo.filetype != 'TGA ' &&
535 fileInfo.filetype != 'TIFF' && fileInfo.filetype != 'PSD ' &&
535 fileInfo.filetype != 'BMPf' && fileInfo.filetype != 'TPIC' && 536 fileInfo.filetype != 'BMPf' && fileInfo.filetype != 'TPIC' &&
536 fileInfo.filetype != 'PNG ' && 537 fileInfo.filetype != 'PNG ' &&
537 (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("jpeg"), kCFCompareCaseInsensitive) != kCFCompareEqualTo && 538 (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("jpeg"), kCFCompareCaseInsensitive) != kCFCompareEqualTo &&
538 CFStringCompare(fileInfo.extension, CFSTR("jpg"), kCFCompareCaseInsensitive) != kCFCompareEqualTo && 539 CFStringCompare(fileInfo.extension, CFSTR("jpg"), kCFCompareCaseInsensitive) != kCFCompareEqualTo &&
539 CFStringCompare(fileInfo.extension, CFSTR("bmp"), kCFCompareCaseInsensitive) != kCFCompareEqualTo && 540 CFStringCompare(fileInfo.extension, CFSTR("bmp"), kCFCompareCaseInsensitive) != kCFCompareEqualTo &&
540 CFStringCompare(fileInfo.extension, CFSTR("tga"), kCFCompareCaseInsensitive) != kCFCompareEqualTo && 541 CFStringCompare(fileInfo.extension, CFSTR("tga"), kCFCompareCaseInsensitive) != kCFCompareEqualTo &&
542 CFStringCompare(fileInfo.extension, CFSTR("psd"), kCFCompareCaseInsensitive) != kCFCompareEqualTo &&
543 CFStringCompare(fileInfo.extension, CFSTR("tiff"), kCFCompareCaseInsensitive) != kCFCompareEqualTo &&
544 CFStringCompare(fileInfo.extension, CFSTR("tif"), kCFCompareCaseInsensitive) != kCFCompareEqualTo &&
541 CFStringCompare(fileInfo.extension, CFSTR("png"), kCFCompareCaseInsensitive) != kCFCompareEqualTo)) 545 CFStringCompare(fileInfo.extension, CFSTR("png"), kCFCompareCaseInsensitive) != kCFCompareEqualTo))
542 ) 546 )
543 { 547 {
diff --git a/linden/indra/newview/llfloaterabout.cpp b/linden/indra/newview/llfloaterabout.cpp
index 9870cf0..9c1d67b 100644
--- a/linden/indra/newview/llfloaterabout.cpp
+++ b/linden/indra/newview/llfloaterabout.cpp
@@ -138,7 +138,7 @@ LLFloaterAbout::LLFloaterAbout()
138#endif 138#endif
139 139
140#if LL_GNUC 140#if LL_GNUC
141 support.append(llformat("Built with GCC version %d\n\n", GCC_VERSION)); 141 support.append(llformat("Built with GCC version %s\n\n", __VERSION__));
142#endif 142#endif
143 143
144 // Position 144 // Position
diff --git a/linden/indra/newview/llfloatergroups.cpp b/linden/indra/newview/llfloatergroups.cpp
index a85ce9d..79e9e31 100644
--- a/linden/indra/newview/llfloatergroups.cpp
+++ b/linden/indra/newview/llfloatergroups.cpp
@@ -610,9 +610,9 @@ void LLPanelGroups::applyChangesToGroups()
610 } 610 }
611 611
612 // chat 612 // chat
613 if (join_group_chat != (!gIMMgr->getIgnoreGroup(group_id))) 613 if (!join_group_chat != gIMMgr->getIgnoreGroup(group_id))
614 { 614 {
615 gIMMgr->updateIgnoreGroup(group_id, join_group_chat); 615 gIMMgr->updateIgnoreGroup(group_id, !join_group_chat);
616 } 616 }
617 } 617 }
618 } 618 }
diff --git a/linden/indra/newview/llfloaterimagepreview.cpp b/linden/indra/newview/llfloaterimagepreview.cpp
index c81081f..8142869 100644
--- a/linden/indra/newview/llfloaterimagepreview.cpp
+++ b/linden/indra/newview/llfloaterimagepreview.cpp
@@ -355,6 +355,16 @@ bool LLFloaterImagePreview::loadImage(const std::string& src_filename)
355 { 355 {
356 codec = IMG_CODEC_PNG; 356 codec = IMG_CODEC_PNG;
357 } 357 }
358#ifdef LL_DARWIN
359 else if( exten == "psd" )
360 {
361 codec = IMG_CODEC_PSD;
362 }
363 else if( exten == "tif" || exten == "tiff" )
364 {
365 codec = IMG_CODEC_TIFF;
366 }
367#endif
358 368
359 LLPointer<LLImageRaw> raw_image = new LLImageRaw; 369 LLPointer<LLImageRaw> raw_image = new LLImageRaw;
360#ifdef LL_DARWIN 370#ifdef LL_DARWIN
@@ -434,9 +444,9 @@ bool LLFloaterImagePreview::loadImage(const std::string& src_filename)
434 return false; 444 return false;
435 } 445 }
436 446
437 raw_image->biasedScaleToPowerOfTwo(1024);
438#endif 447#endif
439 448
449 raw_image->biasedScaleToPowerOfTwo(1024);
440 mRawImagep = raw_image; 450 mRawImagep = raw_image;
441 return true; 451 return true;
442} 452}
diff --git a/linden/indra/newview/llfloaterpreference.cpp b/linden/indra/newview/llfloaterpreference.cpp
index 09336cb..f8a0a4f 100644
--- a/linden/indra/newview/llfloaterpreference.cpp
+++ b/linden/indra/newview/llfloaterpreference.cpp
@@ -134,8 +134,8 @@ LLPreferenceCore::LLPreferenceCore(LLTabContainer* tab_container, LLButton * def
134 mMsgPanel(NULL), 134 mMsgPanel(NULL),
135 mSkinsPanel(NULL), 135 mSkinsPanel(NULL),
136 mLCDPanel(NULL), 136 mLCDPanel(NULL),
137 mPrefsAdvanced(NULL), 137 mPrefsFonts(NULL),
138 mPrefsFonts(NULL) 138 mPrefsAdvanced(NULL)
139{ 139{
140 mGeneralPanel = new LLPanelGeneral(); 140 mGeneralPanel = new LLPanelGeneral();
141 mTabContainer->addTabPanel(mGeneralPanel, mGeneralPanel->getLabel(), FALSE, onTabChanged, mTabContainer); 141 mTabContainer->addTabPanel(mGeneralPanel, mGeneralPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
@@ -195,14 +195,14 @@ LLPreferenceCore::LLPreferenceCore(LLTabContainer* tab_container, LLButton * def
195 mTabContainer->addTabPanel(mSkinsPanel, mSkinsPanel->getLabel(), FALSE, onTabChanged, mTabContainer); 195 mTabContainer->addTabPanel(mSkinsPanel, mSkinsPanel->getLabel(), FALSE, onTabChanged, mTabContainer);
196 mSkinsPanel->setDefaultBtn(default_btn); 196 mSkinsPanel->setDefaultBtn(default_btn);
197 197
198 mPrefsAdvanced = new LLPrefsAdvanced();
199 mTabContainer->addTabPanel(mPrefsAdvanced, mPrefsAdvanced->getLabel(), FALSE, onTabChanged, mTabContainer);
200 mPrefsAdvanced->setDefaultBtn(default_btn);
201
202 mPrefsFonts = new ImpPrefsFonts(); 198 mPrefsFonts = new ImpPrefsFonts();
203 mTabContainer->addTabPanel(mPrefsFonts, mPrefsFonts->getLabel(), FALSE, onTabChanged, mTabContainer); 199 mTabContainer->addTabPanel(mPrefsFonts, mPrefsFonts->getLabel(), FALSE, onTabChanged, mTabContainer);
204 mPrefsFonts->setDefaultBtn(default_btn); 200 mPrefsFonts->setDefaultBtn(default_btn);
205 201
202 mPrefsAdvanced = new LLPrefsAdvanced();
203 mTabContainer->addTabPanel(mPrefsAdvanced, mPrefsAdvanced->getLabel(), FALSE, onTabChanged, mTabContainer);
204 mPrefsAdvanced->setDefaultBtn(default_btn);
205
206 if (!mTabContainer->selectTab(gSavedSettings.getS32("LastPrefTab"))) 206 if (!mTabContainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
207 { 207 {
208 mTabContainer->selectFirstTab(); 208 mTabContainer->selectFirstTab();
diff --git a/linden/indra/newview/llfloaterreporter.cpp b/linden/indra/newview/llfloaterreporter.cpp
index 50e2480..15f278d 100644
--- a/linden/indra/newview/llfloaterreporter.cpp
+++ b/linden/indra/newview/llfloaterreporter.cpp
@@ -361,6 +361,7 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)
361 } 361 }
362 else 362 else
363 { 363 {
364 LLSelectMgr::waitForObjectResponse(mObjectID);
364 // we have to query the simulator for information 365 // we have to query the simulator for information
365 // about this object 366 // about this object
366 LLMessageSystem* msg = gMessageSystem; 367 LLMessageSystem* msg = gMessageSystem;
diff --git a/linden/indra/newview/llfloatersnapshot.cpp b/linden/indra/newview/llfloatersnapshot.cpp
index c0e972d..a58120d 100644
--- a/linden/indra/newview/llfloatersnapshot.cpp
+++ b/linden/indra/newview/llfloatersnapshot.cpp
@@ -2128,7 +2128,6 @@ BOOL LLFloaterSnapshot::postBuild()
2128 //gSnapshotFloaterView->addChild(this); 2128 //gSnapshotFloaterView->addChild(this);
2129 2129
2130 impl.updateControls(this); 2130 impl.updateControls(this);
2131 impl.updateLayout(this);
2132 2131
2133 return TRUE; 2132 return TRUE;
2134} 2133}
diff --git a/linden/indra/newview/llfloaterteleporthistory.cpp b/linden/indra/newview/llfloaterteleporthistory.cpp
index 65675fa..c901029 100644
--- a/linden/indra/newview/llfloaterteleporthistory.cpp
+++ b/linden/indra/newview/llfloaterteleporthistory.cpp
@@ -108,6 +108,7 @@ BOOL LLFloaterTeleportHistory::postBuild()
108 childSetAction("teleport", onTeleport, this); 108 childSetAction("teleport", onTeleport, this);
109 childSetAction("show_on_map", onShowOnMap, this); 109 childSetAction("show_on_map", onShowOnMap, this);
110 childSetAction("copy_slurl", onCopySLURL, this); 110 childSetAction("copy_slurl", onCopySLURL, this);
111 childSetAction("clear_history", onClearHistory,this);
111 loadEntrys(); 112 loadEntrys();
112 113
113 return TRUE; 114 return TRUE;
@@ -121,7 +122,13 @@ void LLFloaterTeleportHistory::saveEntry(LLSD toSave)
121 LLSDSerialize::toPrettyXML(tpList, file); 122 LLSDSerialize::toPrettyXML(tpList, file);
122 file.close(); 123 file.close();
123} 124}
124 125void LLFloaterTeleportHistory::clearHistory()
126{
127 tpList.clear();
128 saveEntry(tpList);
129 mPlacesOutList->clearRows();
130 mPlacesInList->clearRows();
131}
125std::string LLFloaterTeleportHistory::getFileName() 132std::string LLFloaterTeleportHistory::getFileName()
126{ 133{
127 std::string path=gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, ""); 134 std::string path=gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "");
@@ -303,6 +310,13 @@ void LLFloaterTeleportHistory::onTeleport(void* data)
303} 310}
304 311
305// static 312// static
313void LLFloaterTeleportHistory::onClearHistory(void* data)
314{
315 LLFloaterTeleportHistory* self = (LLFloaterTeleportHistory*) data;
316 self->clearHistory();
317}
318
319// static
306void LLFloaterTeleportHistory::onShowOnMap(void* data) 320void LLFloaterTeleportHistory::onShowOnMap(void* data)
307{ 321{
308 LLFloaterTeleportHistory* self = (LLFloaterTeleportHistory*) data; 322 LLFloaterTeleportHistory* self = (LLFloaterTeleportHistory*) data;
diff --git a/linden/indra/newview/llfloaterteleporthistory.h b/linden/indra/newview/llfloaterteleporthistory.h
index e458259..702daf5 100644
--- a/linden/indra/newview/llfloaterteleporthistory.h
+++ b/linden/indra/newview/llfloaterteleporthistory.h
@@ -63,9 +63,12 @@ class LLFloaterTeleportHistory : public LLFloater
63 /// @brief: adds a teleport destination to the list of visited places 63 /// @brief: adds a teleport destination to the list of visited places
64 void addEntry(std::string regionName, S16 x, S16 y, S16 z,bool outList); 64 void addEntry(std::string regionName, S16 x, S16 y, S16 z,bool outList);
65 65
66 void clearHistory();
67
66 protected: 68 protected:
67 static void onInPlacesSelected(LLUICtrl* ctrl, void* data); 69 static void onInPlacesSelected(LLUICtrl* ctrl, void* data);
68 static void onOutPlacesSelected(LLUICtrl* ctrl, void* data); 70 static void onOutPlacesSelected(LLUICtrl* ctrl, void* data);
71 static void onClearHistory(void* data);
69 static void onTeleport(void* data); 72 static void onTeleport(void* data);
70 static void onShowOnMap(void* data); 73 static void onShowOnMap(void* data);
71 static void onCopySLURL(void* data); 74 static void onCopySLURL(void* data);
diff --git a/linden/indra/newview/llfloatertools.cpp b/linden/indra/newview/llfloatertools.cpp
index f6f09b1..6744faf 100644
--- a/linden/indra/newview/llfloatertools.cpp
+++ b/linden/indra/newview/llfloatertools.cpp
@@ -84,7 +84,7 @@
84#include "llvograss.h" 84#include "llvograss.h"
85#include "llvotree.h" 85#include "llvotree.h"
86#include "lluictrlfactory.h" 86#include "lluictrlfactory.h"
87 87#include "qtoolalign.h"
88#include "hippoLimits.h" 88#include "hippoLimits.h"
89 89
90// Globals 90// Globals
@@ -273,6 +273,8 @@ BOOL LLFloaterTools::postBuild()
273 childSetCommitCallback("radio stretch",commit_select_tool,LLToolCompScale::getInstance()); 273 childSetCommitCallback("radio stretch",commit_select_tool,LLToolCompScale::getInstance());
274 mRadioSelectFace = getChild<LLCheckBoxCtrl>("radio select face"); 274 mRadioSelectFace = getChild<LLCheckBoxCtrl>("radio select face");
275 childSetCommitCallback("radio select face",commit_select_tool,LLToolFace::getInstance()); 275 childSetCommitCallback("radio select face",commit_select_tool,LLToolFace::getInstance());
276 mRadioAlign = getChild<LLCheckBoxCtrl>("radio align");
277 childSetCommitCallback("radio align",commit_select_tool,QToolAlign::getInstance());
276 mCheckSelectIndividual = getChild<LLCheckBoxCtrl>("checkbox edit linked parts"); 278 mCheckSelectIndividual = getChild<LLCheckBoxCtrl>("checkbox edit linked parts");
277 childSetValue("checkbox edit linked parts",(BOOL)gSavedSettings.getBOOL("EditLinkedParts")); 279 childSetValue("checkbox edit linked parts",(BOOL)gSavedSettings.getBOOL("EditLinkedParts"));
278 childSetCommitCallback("checkbox edit linked parts",commit_select_component,this); 280 childSetCommitCallback("checkbox edit linked parts",commit_select_component,this);
@@ -528,14 +530,54 @@ void LLFloaterTools::refresh()
528 mTab->enableTabButton(idx_face, all_volume); 530 mTab->enableTabButton(idx_face, all_volume);
529 mTab->enableTabButton(idx_contents, all_volume); 531 mTab->enableTabButton(idx_contents, all_volume);
530 532
531 // Refresh object and prim count labels 533 // Added in Link Num value -HgB
532 LLLocale locale(LLLocale::USER_LOCALE); 534 if (gSavedSettings.getBOOL("EditLinkedParts") && LLSelectMgr::getInstance()->getEditSelection()->getObjectCount() == 1) //Selecting a single prim in "Edit Linked" mode, show link number
533 std::string obj_count_string; 535 {
534 LLResMgr::getInstance()->getIntegerString(obj_count_string, LLSelectMgr::getInstance()->getSelection()->getRootObjectCount()); 536 childSetVisible("obj_count", FALSE);
535 childSetTextArg("obj_count", "[COUNT]", obj_count_string); 537 childSetVisible("prim_count", FALSE);
536 std::string prim_count_string; 538 childSetVisible("link_num", TRUE);
537 LLResMgr::getInstance()->getIntegerString(prim_count_string, LLSelectMgr::getInstance()->getSelection()->getObjectCount()); 539
538 childSetTextArg("prim_count", "[COUNT]", prim_count_string); 540 std::string value_string = "";
541 LLViewerObject* selected = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
542 if (selected && selected->getRootEdit())
543 {
544 LLViewerObject::child_list_t children = selected->getRootEdit()->getChildren();
545 if (children.empty())
546 {
547 // An unlinked prim is "link 0".
548 value_string = "0";
549 }
550 else
551 {
552 children.push_front(selected->getRootEdit()); // need root in the list too
553 S32 index = 0;
554 for (LLViewerObject::child_list_t::iterator iter = children.begin(); iter != children.end(); ++iter)
555 {
556 index++;
557 if ((*iter)->isSelected())
558 {
559 LLResMgr::getInstance()->getIntegerString(value_string, index);
560 break;
561 }
562 }
563 }
564 }
565 childSetTextArg("link_num", "[NUMBER]", value_string);
566 }
567 else
568 {
569 // Refresh object and prim count labels
570 childSetVisible("obj_count", TRUE);
571 childSetVisible("prim_count", TRUE);
572 childSetVisible("link_num", FALSE);
573 LLLocale locale(LLLocale::USER_LOCALE);
574 std::string obj_count_string;
575 LLResMgr::getInstance()->getIntegerString(obj_count_string, LLSelectMgr::getInstance()->getSelection()->getRootObjectCount());
576 childSetTextArg("obj_count", "[COUNT]", obj_count_string);
577 std::string prim_count_string;
578 LLResMgr::getInstance()->getIntegerString(prim_count_string, LLSelectMgr::getInstance()->getSelection()->getObjectCount());
579 childSetTextArg("prim_count", "[COUNT]", prim_count_string);
580 }
539 581
540 updateToolsPrecision(); 582 updateToolsPrecision();
541 583
@@ -658,6 +700,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
658 tool == LLToolCompScale::getInstance() || 700 tool == LLToolCompScale::getInstance() ||
659 tool == LLToolFace::getInstance() || 701 tool == LLToolFace::getInstance() ||
660 tool == LLToolIndividual::getInstance() || 702 tool == LLToolIndividual::getInstance() ||
703 tool == QToolAlign::getInstance() ||
661 tool == LLToolPipette::getInstance(); 704 tool == LLToolPipette::getInstance();
662 705
663 mBtnEdit ->setToggleState( edit_visible ); 706 mBtnEdit ->setToggleState( edit_visible );
@@ -680,6 +723,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
680 mRadioPosition ->set( tool == LLToolCompTranslate::getInstance() ); 723 mRadioPosition ->set( tool == LLToolCompTranslate::getInstance() );
681 mRadioRotate ->set( tool == LLToolCompRotate::getInstance() ); 724 mRadioRotate ->set( tool == LLToolCompRotate::getInstance() );
682 mRadioStretch ->set( tool == LLToolCompScale::getInstance() ); 725 mRadioStretch ->set( tool == LLToolCompScale::getInstance() );
726 mRadioAlign->set( tool == QToolAlign::getInstance() );
683 727
684 if (mComboGridMode) 728 if (mComboGridMode)
685 { 729 {
@@ -887,8 +931,15 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
887 childSetVisible("Strength:", land_visible); 931 childSetVisible("Strength:", land_visible);
888 } 932 }
889 933
890 childSetVisible("obj_count", !land_visible); 934 if (gSavedSettings.getBOOL("EditLinkedParts") && LLSelectMgr::getInstance()->getEditSelection()->getObjectCount() == 1)
891 childSetVisible("prim_count", !land_visible); 935 {
936 childSetVisible("link_num", !land_visible);
937 }
938 else
939 {
940 childSetVisible("obj_count", !land_visible);
941 childSetVisible("prim_count", !land_visible);
942 }
892 mTab->setVisible(!land_visible); 943 mTab->setVisible(!land_visible);
893 mPanelLandInfo->setVisible(land_visible); 944 mPanelLandInfo->setVisible(land_visible);
894} 945}
diff --git a/linden/indra/newview/llfloatertools.h b/linden/indra/newview/llfloatertools.h
index ad5be6c..bbf07ec 100644
--- a/linden/indra/newview/llfloatertools.h
+++ b/linden/indra/newview/llfloatertools.h
@@ -140,6 +140,7 @@ public:
140 LLCheckBoxCtrl *mRadioRotate; 140 LLCheckBoxCtrl *mRadioRotate;
141 LLCheckBoxCtrl *mRadioStretch; 141 LLCheckBoxCtrl *mRadioStretch;
142 LLCheckBoxCtrl *mRadioSelectFace; 142 LLCheckBoxCtrl *mRadioSelectFace;
143 LLCheckBoxCtrl *mRadioAlign;
143 144
144 LLCheckBoxCtrl *mCheckSelectIndividual; 145 LLCheckBoxCtrl *mCheckSelectIndividual;
145 146
diff --git a/linden/indra/newview/llgesturemgr.cpp b/linden/indra/newview/llgesturemgr.cpp
index c3f7b93..bb678d7 100644
--- a/linden/indra/newview/llgesturemgr.cpp
+++ b/linden/indra/newview/llgesturemgr.cpp
@@ -603,6 +603,207 @@ BOOL LLGestureManager::triggerAndReviseString(const std::string &utf8str, std::s
603 LLWeb::loadURLInternal("http://failbook.failblog.org/"); 603 LLWeb::loadURLInternal("http://failbook.failblog.org/");
604 return TRUE; 604 return TRUE;
605 } 605 }
606 else if (LLStringUtil::compareInsensitive("/icanhaszombie", cur_token) == 0 ||
607 LLStringUtil::compareInsensitive("/icanhaszombies", cur_token) == 0)
608 {
609 LLViewerImage* kitteh = gImageList.getImageFromFile("zombiecat.png", TRUE, TRUE);
610 if (kitteh)
611 {
612 S32 left, top;
613 gFloaterView->getNewFloaterPosition(&left, &top);
614 LLRect rect = gSavedSettings.getRect("PreviewTextureRect");
615 rect.translate(left - rect.mLeft, top - rect.mTop);
616
617 LLPreviewTexture* preview;
618 preview = new LLPreviewTexture(rect, "Zombiecat!", kitteh);
619 preview->setSourceID(LLUUID::generateNewID());
620 preview->setFocus(TRUE);
621 preview->center();
622 gFloaterView->adjustToFitScreen(preview, FALSE);
623 }
624 return TRUE;
625 }
626 else if (LLStringUtil::compareInsensitive("/icanhassupport", cur_token) == 0 ||
627 LLStringUtil::compareInsensitive("/icanhashelp", cur_token) == 0 ||
628 LLStringUtil::compareInsensitive("/icanhashalp", cur_token) == 0)
629 {
630 LLWeb::loadURLInternal("http://support.imprudenceviewer.org/");
631 return TRUE;
632 }
633 else if (LLStringUtil::compareInsensitive("/icanhasblog", cur_token) == 0)
634 {
635 LLWeb::loadURLInternal("http://www.imprudenceviewer.org/");
636 return TRUE;
637 }
638 else if (LLStringUtil::compareInsensitive("/icanhascodie", cur_token) == 0)
639 {
640 LLChat chat;
641 chat.mText = "All work and no play makes Codie a dull girl. All work and no play...";
642 chat.mSourceType = CHAT_SOURCE_SYSTEM;
643 LLFloaterChat::addChat(chat);
644 if (revised_string)
645 {
646 revised_string->assign(LLStringUtil::null);
647 }
648 return TRUE;
649 }
650 else if (LLStringUtil::compareInsensitive("/icanhasfail", cur_token) == 0)
651 {
652 LLWeb::loadURLInternal("http://www.failblog.org/");
653 return TRUE;
654 }
655 else if (LLStringUtil::compareInsensitive("/icanhasdownload", cur_token) == 0 ||
656 LLStringUtil::compareInsensitive("/icanhasdownloads", cur_token) == 0 ||
657 LLStringUtil::compareInsensitive("/icanhasupdate", cur_token) == 0 ||
658 LLStringUtil::compareInsensitive("/icanhasupdates", cur_token) == 0 )
659 {
660 LLWeb::loadURLInternal("http://imprudenceviewer.org/wiki/Downloads");
661 return TRUE;
662 }
663 else if (LLStringUtil::compareInsensitive("/icanhasfeatures", cur_token) == 0)
664 {
665 LLWeb::loadURLInternal("http://imprudenceviewer.org/wiki/Features");
666 return TRUE;
667 }
668 else if (LLStringUtil::compareInsensitive("/icanhaswiki", cur_token) == 0)
669 {
670 LLWeb::loadURLInternal("http://imprudenceviewer.org/wiki/");
671 return TRUE;
672 }
673 else if (LLStringUtil::compareInsensitive("/icanhasbugs", cur_token) == 0 ||
674 LLStringUtil::compareInsensitive("/icanhasbug", cur_token) == 0 )
675 {
676 LLWeb::loadURLInternal("http://redmine.imprudenceviewer.org/");
677 return TRUE;
678 }
679 else if (LLStringUtil::compareInsensitive("/icanhasgit", cur_token) == 0)
680 {
681 LLWeb::loadURLInternal("http://github.com/imprudence/imprudence/");
682 return TRUE;
683 }
684 else if (LLStringUtil::compareInsensitive("/icanhasplurk", cur_token) == 0)
685 {
686 LLWeb::loadURLInternal("http://plurk.com/imprudence");
687 return TRUE;
688 }
689 else if (LLStringUtil::compareInsensitive("/icanhastwitter", cur_token) == 0)
690 {
691 LLWeb::loadURLInternal("http://twitter.com/ImpViewer");
692 return TRUE;
693 }
694
695
696 else if (LLStringUtil::compareInsensitive("/icanhasimprudence", cur_token) == 0)
697 {
698 LLChat chat;
699 chat.mText = "You are using it right now, silly!...";
700 chat.mSourceType = CHAT_SOURCE_SYSTEM;
701 LLFloaterChat::addChat(chat);
702 if (revised_string)
703 {
704 revised_string->assign(LLStringUtil::null);
705 }
706 return TRUE;
707 }
708 else if (LLStringUtil::compareInsensitive("/icanhasnoms", cur_token) == 0 ||
709 LLStringUtil::compareInsensitive("/icanhasnom", cur_token) == 0)
710 {
711 LLViewerImage* kitteh = gImageList.getImageFromFile("nomnom.png", TRUE, TRUE);
712 if (kitteh)
713 {
714 S32 left, top;
715 gFloaterView->getNewFloaterPosition(&left, &top);
716 LLRect rect = gSavedSettings.getRect("PreviewTextureRect");
717 rect.translate(left - rect.mLeft, top - rect.mTop);
718
719 LLPreviewTexture* preview;
720 preview = new LLPreviewTexture(rect, "Om nom nom!", kitteh);
721 preview->setSourceID(LLUUID::generateNewID());
722 preview->setFocus(TRUE);
723 preview->center();
724 gFloaterView->adjustToFitScreen(preview, FALSE);
725 }
726 return TRUE;
727 }
728 else if (LLStringUtil::compareInsensitive("/icanhasceilingcat", cur_token) == 0 ||
729 LLStringUtil::compareInsensitive("/icanhascielingcat", cur_token) == 0)
730 {
731 LLViewerImage* kitteh = gImageList.getImageFromFile("ceilingcat.png", TRUE, TRUE);
732 if (kitteh)
733 {
734 S32 left, top;
735 gFloaterView->getNewFloaterPosition(&left, &top);
736 LLRect rect = gSavedSettings.getRect("PreviewTextureRect");
737 rect.translate(left - rect.mLeft, top - rect.mTop);
738
739 LLPreviewTexture* preview;
740 preview = new LLPreviewTexture(rect, "Ceiling Cat is watching you!", kitteh);
741 preview->setSourceID(LLUUID::generateNewID());
742 preview->setFocus(TRUE);
743 preview->center();
744 gFloaterView->adjustToFitScreen(preview, FALSE);
745 }
746 return TRUE;
747 }
748 else if (LLStringUtil::compareInsensitive("/icanhascake", cur_token) == 0 )
749 {
750 LLViewerImage* kitteh = gImageList.getImageFromFile("cakeisalie.png", TRUE, TRUE);
751 if (kitteh)
752 {
753 S32 left, top;
754 gFloaterView->getNewFloaterPosition(&left, &top);
755 LLRect rect = gSavedSettings.getRect("PreviewTextureRect");
756 rect.translate(left - rect.mLeft, top - rect.mTop);
757
758 LLPreviewTexture* preview;
759 preview = new LLPreviewTexture(rect, "THE CAKE IS A LIE!", kitteh);
760 preview->setSourceID(LLUUID::generateNewID());
761 preview->setFocus(TRUE);
762 preview->center();
763 gFloaterView->adjustToFitScreen(preview, FALSE);
764 }
765 return TRUE;
766 }
767 else if (LLStringUtil::compareInsensitive("/icanhastentacles", cur_token) == 0 )
768 {
769 LLViewerImage* kitteh = gImageList.getImageFromFile("octopus.png", TRUE, TRUE);
770 if (kitteh)
771 {
772 S32 left, top;
773 gFloaterView->getNewFloaterPosition(&left, &top);
774 LLRect rect = gSavedSettings.getRect("PreviewTextureRect");
775 rect.translate(left - rect.mLeft, top - rect.mTop);
776
777 LLPreviewTexture* preview;
778 preview = new LLPreviewTexture(rect, "All hail the mighty octopus!", kitteh);
779 preview->setSourceID(LLUUID::generateNewID());
780 preview->setFocus(TRUE);
781 preview->center();
782 gFloaterView->adjustToFitScreen(preview, FALSE);
783 }
784 return TRUE;
785 }
786 else if (LLStringUtil::compareInsensitive("/icanhashugs", cur_token) == 0 ||
787 LLStringUtil::compareInsensitive("/icanhashug", cur_token) == 0)
788 {
789 LLViewerImage* kitteh = gImageList.getImageFromFile("hugs.png", TRUE, TRUE);
790 if (kitteh)
791 {
792 S32 left, top;
793 gFloaterView->getNewFloaterPosition(&left, &top);
794 LLRect rect = gSavedSettings.getRect("PreviewTextureRect");
795 rect.translate(left - rect.mLeft, top - rect.mTop);
796
797 LLPreviewTexture* preview;
798 preview = new LLPreviewTexture(rect, "Yes, you can has hugs!", kitteh);
799 preview->setSourceID(LLUUID::generateNewID());
800 preview->setFocus(TRUE);
801 preview->center();
802 gFloaterView->adjustToFitScreen(preview, FALSE);
803 }
804 return TRUE;
805 }
806
606 } 807 }
607 808
608 if(!gesture) 809 if(!gesture)
diff --git a/linden/indra/newview/llgroupnotify.cpp b/linden/indra/newview/llgroupnotify.cpp
index 1b00dfb..8e98cbc 100644
--- a/linden/indra/newview/llgroupnotify.cpp
+++ b/linden/indra/newview/llgroupnotify.cpp
@@ -196,6 +196,7 @@ LLGroupNotifyBox::LLGroupNotifyBox(const std::string& subject,
196 // Sadly, our LLTextEditor can't handle both styled and unstyled text 196 // Sadly, our LLTextEditor can't handle both styled and unstyled text
197 // at the same time. Hence this space must be styled. JC 197 // at the same time. Hence this space must be styled. JC
198 text->appendColoredText(std::string(" "),false,false,LLColor4::grey4); 198 text->appendColoredText(std::string(" "),false,false,LLColor4::grey4);
199 text->setParseHTML(TRUE);
199 text->appendColoredText(std::string("\n\n") + message,false,false,LLColor4::grey4); 200 text->appendColoredText(std::string("\n\n") + message,false,false,LLColor4::grey4);
200 201
201 LLColor4 semi_transparent(1.0f,1.0f,1.0f,0.8f); 202 LLColor4 semi_transparent(1.0f,1.0f,1.0f,0.8f);
diff --git a/linden/indra/newview/llimview.cpp b/linden/indra/newview/llimview.cpp
index 5061197..2253404 100644
--- a/linden/indra/newview/llimview.cpp
+++ b/linden/indra/newview/llimview.cpp
@@ -613,11 +613,11 @@ void LLIMMgr::addMessage(
613 // create IM window as necessary 613 // create IM window as necessary
614 if(!floater) 614 if(!floater)
615 { 615 {
616 if (!mIgnoreGroupList.empty()) 616 if (gIMMgr->getIgnoreGroupListCount() > 0 && gAgent.isInGroup(session_id))
617 { 617 {
618 // Check to see if we're blocking this group's chat 618 // Check to see if we're blocking this group's chat
619 LLGroupData *group_data = NULL; 619 LLGroupData* group_data = NULL;
620 620
621 // Search for this group in the agent's groups list 621 // Search for this group in the agent's groups list
622 LLDynamicArray<LLGroupData>::iterator i; 622 LLDynamicArray<LLGroupData>::iterator i;
623 623
@@ -631,9 +631,8 @@ void LLIMMgr::addMessage(
631 } 631 }
632 632
633 // If the group is in our list then return 633 // If the group is in our list then return
634 if (group_data && getIgnoreGroup(group_data->mID)) 634 if (group_data && gIMMgr->getIgnoreGroup(group_data->mID))
635 { 635 {
636 // llinfos << "ignoring chat from group " << group_data->mID << llendl;
637 return; 636 return;
638 } 637 }
639 } 638 }
@@ -1383,7 +1382,7 @@ void LLIMMgr::saveIgnoreGroup()
1383 } 1382 }
1384} 1383}
1385 1384
1386void LLIMMgr::updateIgnoreGroup(const LLUUID& group_id, const bool& ignore) 1385void LLIMMgr::updateIgnoreGroup(const LLUUID& group_id, bool ignore)
1387{ 1386{
1388 if (group_id.notNull()) 1387 if (group_id.notNull())
1389 { 1388 {
diff --git a/linden/indra/newview/llimview.h b/linden/indra/newview/llimview.h
index 8f665d2..2539203 100644
--- a/linden/indra/newview/llimview.h
+++ b/linden/indra/newview/llimview.h
@@ -174,7 +174,7 @@ public:
174 174
175 void loadIgnoreGroup(); 175 void loadIgnoreGroup();
176 void saveIgnoreGroup(); 176 void saveIgnoreGroup();
177 void updateIgnoreGroup(const LLUUID& group_id, const bool& ignore); 177 void updateIgnoreGroup(const LLUUID& group_id, bool ignore);
178 // Returns true if group chat is ignored for the UUID, false if not 178 // Returns true if group chat is ignored for the UUID, false if not
179 bool getIgnoreGroup(const LLUUID& group_id); 179 bool getIgnoreGroup(const LLUUID& group_id);
180 180
@@ -219,6 +219,10 @@ private:
219 LLSD mPendingAgentListUpdates; 219 LLSD mPendingAgentListUpdates;
220 220
221 std::list<LLUUID> mIgnoreGroupList; 221 std::list<LLUUID> mIgnoreGroupList;
222
223public:
224
225 S32 getIgnoreGroupListCount() { return mIgnoreGroupList.size(); }
222}; 226};
223 227
224 228
diff --git a/linden/indra/newview/llpanelgroupgeneral.cpp b/linden/indra/newview/llpanelgroupgeneral.cpp
index 55e1b33..e0d6376 100644
--- a/linden/indra/newview/llpanelgroupgeneral.cpp
+++ b/linden/indra/newview/llpanelgroupgeneral.cpp
@@ -561,6 +561,10 @@ bool LLPanelGroupGeneral::apply(std::string& mesg)
561 gIMMgr->saveIgnoreGroup(); 561 gIMMgr->saveIgnoreGroup();
562 } 562 }
563 563
564 mCtrlReceiveNotices->resetDirty(); //resetDirty() here instead of in update because this is where the settings
565 mCtrlListGroup->resetDirty(); //are actually being applied. onCommitUserOnly doesn't call updateChanged directly.
566 mCtrlReceiveChat->resetDirty();
567
564 mChanged = FALSE; 568 mChanged = FALSE;
565 569
566 return true; 570 return true;
@@ -774,14 +778,21 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
774 { 778 {
775 mCtrlReceiveNotices->setEnabled(mAllowEdit); 779 mCtrlReceiveNotices->setEnabled(mAllowEdit);
776 } 780 }
777 mCtrlReceiveNotices->resetDirty();
778 } 781 }
779 782
780 if (mCtrlReceiveChat) 783 if (mCtrlReceiveChat)
781 { 784 {
782 mCtrlReceiveChat->setVisible(is_member); 785 mCtrlReceiveChat->setVisible(is_member);
783 mCtrlReceiveChat->setEnabled(TRUE); 786 mCtrlReceiveChat->setEnabled(TRUE);
784 mCtrlReceiveChat->resetDirty(); 787 }
788
789 if (mCtrlListGroup)
790 {
791 mCtrlListGroup->setVisible(is_member);
792 if (is_member)
793 {
794 mCtrlListGroup->setEnabled(mAllowEdit);
795 }
785 } 796 }
786 797
787 798
diff --git a/linden/indra/newview/llprefsim.cpp b/linden/indra/newview/llprefsim.cpp
index 2c8ef4d..e915bd2 100644
--- a/linden/indra/newview/llprefsim.cpp
+++ b/linden/indra/newview/llprefsim.cpp
@@ -45,6 +45,7 @@
45#include "llviewercontrol.h" 45#include "llviewercontrol.h"
46#include "llviewernetwork.h" 46#include "llviewernetwork.h"
47#include "lluictrlfactory.h" 47#include "lluictrlfactory.h"
48#include "llstartup.h"
48 49
49#include "lldirpicker.h" 50#include "lldirpicker.h"
50 51
@@ -106,22 +107,23 @@ BOOL LLPrefsIMImpl::postBuild()
106 childSetLabelArg("send_im_to_email", "[EMAIL]", getString("log_in_to_change")); 107 childSetLabelArg("send_im_to_email", "[EMAIL]", getString("log_in_to_change"));
107 108
108 // Don't enable this until we get personal data 109 // Don't enable this until we get personal data
109 childDisable("include_im_in_chat_console"); 110 // Unless we're already logged in. Some non-SL grids won't send us the data we need -- MC
110 childDisable("include_im_in_chat_history"); 111 childSetEnabled("include_im_in_chat_console", LLStartUp::isLoggedIn());
111 childDisable("show_timestamps_check"); 112 childSetEnabled("include_im_in_chat_history", LLStartUp::isLoggedIn());
112 childDisable("friends_online_notify_checkbox"); 113 childSetEnabled("show_timestamps_check", LLStartUp::isLoggedIn());
114 childSetEnabled("friends_online_notify_checkbox", LLStartUp::isLoggedIn());
113 115
114 childDisable("online_visibility"); 116 childSetEnabled("online_visibility", LLStartUp::isLoggedIn());
115 childDisable("send_im_to_email"); 117 childSetEnabled("send_im_to_email", LLStartUp::isLoggedIn());
116 childDisable("log_instant_messages"); 118 childSetEnabled("log_instant_messages", LLStartUp::isLoggedIn());
117 childDisable("log_chat"); 119 childSetEnabled("log_chat", LLStartUp::isLoggedIn());
118 childDisable("log_show_history"); 120 childSetEnabled("log_show_history", LLStartUp::isLoggedIn());
119 childDisable("log_path_button"); 121 childSetEnabled("log_path_button", LLStartUp::isLoggedIn());
120 childDisable("busy_response"); 122 childSetEnabled("busy_response", LLStartUp::isLoggedIn());
121 childDisable("log_instant_messages_timestamp"); 123 childSetEnabled("log_instant_messages_timestamp", LLStartUp::isLoggedIn());
122 childDisable("log_chat_timestamp"); 124 childSetEnabled("log_chat_timestamp", LLStartUp::isLoggedIn());
123 childDisable("log_chat_IM"); 125 childSetEnabled("log_chat_IM", LLStartUp::isLoggedIn());
124 childDisable("log_date_timestamp"); 126 childSetEnabled("log_date_timestamp", LLStartUp::isLoggedIn());
125 127
126 childSetText("busy_response", getString("log_in_to_change")); 128 childSetText("busy_response", getString("log_in_to_change"));
127 129
diff --git a/linden/indra/newview/llselectmgr.cpp b/linden/indra/newview/llselectmgr.cpp
index f154de9..5a10e98 100644
--- a/linden/indra/newview/llselectmgr.cpp
+++ b/linden/indra/newview/llselectmgr.cpp
@@ -4297,6 +4297,12 @@ void LLSelectMgr::requestObjectPropertiesFamily(LLViewerObject* object)
4297 msg->sendReliable( regionp->getHost() ); 4297 msg->sendReliable( regionp->getHost() );
4298} 4298}
4299 4299
4300// static
4301void LLSelectMgr::waitForObjectResponse(LLUUID id)
4302{
4303 if (sObjectPropertiesFamilyRequests.count(id) == 0)
4304 sObjectPropertiesFamilyRequests.insert(id);
4305}
4300 4306
4301// static 4307// static
4302void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data) 4308void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data)
diff --git a/linden/indra/newview/llselectmgr.h b/linden/indra/newview/llselectmgr.h
index c19d33d..495e61c 100644
--- a/linden/indra/newview/llselectmgr.h
+++ b/linden/indra/newview/llselectmgr.h
@@ -361,6 +361,7 @@ public:
361 ~LLSelectMgr(); 361 ~LLSelectMgr();
362 362
363 static void cleanupGlobals(); 363 static void cleanupGlobals();
364 static void waitForObjectResponse(LLUUID id);
364 365
365 // LLEditMenuHandler interface 366 // LLEditMenuHandler interface
366 virtual BOOL canUndo() const; 367 virtual BOOL canUndo() const;
diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp
index e997e5f..d5adc11 100644
--- a/linden/indra/newview/llstartup.cpp
+++ b/linden/indra/newview/llstartup.cpp
@@ -1073,10 +1073,11 @@ bool idle_startup()
1073 // color init must be after saved settings loaded 1073 // color init must be after saved settings loaded
1074 init_colors(); 1074 init_colors();
1075 1075
1076 if (gSavedSettings.getBOOL("VivoxLicenseAccepted")) 1076 if (gSavedSettings.getBOOL("VivoxLicenseAccepted") || gHippoGridManager->getConnectedGrid()->isSecondLife())
1077 { 1077 {
1078 // skipping over STATE_LOGIN_VOICE_LICENSE since we don't need it 1078 // skipping over STATE_LOGIN_VOICE_LICENSE since we don't need it
1079 // skipping over STATE_UPDATE_CHECK because that just waits for input 1079 // skipping over STATE_UPDATE_CHECK because that just waits for input
1080 // We don't do this on non-SL grids either
1080 LLStartUp::setStartupState( STATE_LOGIN_AUTH_INIT ); 1081 LLStartUp::setStartupState( STATE_LOGIN_AUTH_INIT );
1081 } 1082 }
1082 else 1083 else
@@ -2788,8 +2789,11 @@ bool idle_startup()
2788 // Have the agent start watching the friends list so we can update proxies 2789 // Have the agent start watching the friends list so we can update proxies
2789 gAgent.observeFriends(); 2790 gAgent.observeFriends();
2790 2791
2791 // Start loading inventory 2792 if (gSavedSettings.getBOOL("FetchInventoryOnLogin"))
2792 gInventory.startBackgroundFetch(); 2793 {
2794 // Start loading inventory
2795 gInventory.startBackgroundFetch();
2796 }
2793 2797
2794 if (gSavedSettings.getBOOL("LoginAsGod")) 2798 if (gSavedSettings.getBOOL("LoginAsGod"))
2795 { 2799 {
diff --git a/linden/indra/newview/llstartup.h b/linden/indra/newview/llstartup.h
index 9a3c91c..08862e6 100644
--- a/linden/indra/newview/llstartup.h
+++ b/linden/indra/newview/llstartup.h
@@ -124,6 +124,9 @@ public:
124 static bool shouldAutoLogin() { return mShouldAutoLogin; }; 124 static bool shouldAutoLogin() { return mShouldAutoLogin; };
125 static void setShouldAutoLogin(bool value) { mShouldAutoLogin = value; }; 125 static void setShouldAutoLogin(bool value) { mShouldAutoLogin = value; };
126 126
127 // Returns true if startup has been successfully completed
128 static bool isLoggedIn() { return gStartupState == STATE_STARTED; }
129
127private: 130private:
128 static bool mStartedOnce; 131 static bool mStartedOnce;
129 static bool mShouldAutoLogin; 132 static bool mShouldAutoLogin;
diff --git a/linden/indra/newview/llviewermenufile.cpp b/linden/indra/newview/llviewermenufile.cpp
index 432fcc5..1981bb9 100644
--- a/linden/indra/newview/llviewermenufile.cpp
+++ b/linden/indra/newview/llviewermenufile.cpp
@@ -640,6 +640,38 @@ void upload_new_resource(const std::string& src_filename, std::string name,
640 return; 640 return;
641 } 641 }
642 } 642 }
643#ifdef LL_DARWIN
644 else if(exten == "psd")
645 {
646 asset_type = LLAssetType::AT_TEXTURE;
647 if (!LLViewerImageList::createUploadFile(src_filename,
648 filename,
649 IMG_CODEC_PSD ))
650 {
651 error_message = llformat("Problem with file %s:\n\n%s\n",
652 src_filename.c_str(), LLImage::getLastError().c_str());
653 args["FILE"] = src_filename;
654 args["ERROR"] = LLImage::getLastError();
655 upload_error(error_message, "ProblemWithFile", filename, args);
656 return;
657 }
658 }
659 else if(exten == "tif" || exten == "tiff")
660 {
661 asset_type = LLAssetType::AT_TEXTURE;
662 if (!LLViewerImageList::createUploadFile(src_filename,
663 filename,
664 IMG_CODEC_TIFF ))
665 {
666 error_message = llformat("Problem with file %s:\n\n%s\n",
667 src_filename.c_str(), LLImage::getLastError().c_str());
668 args["FILE"] = src_filename;
669 args["ERROR"] = LLImage::getLastError();
670 upload_error(error_message, "ProblemWithFile", filename, args);
671 return;
672 }
673 }
674#endif
643 else if(exten == "wav") 675 else if(exten == "wav")
644 { 676 {
645 asset_type = LLAssetType::AT_SOUND; // tag it as audio 677 asset_type = LLAssetType::AT_SOUND; // tag it as audio
diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp
index a512a66..dbf9d72 100755
--- a/linden/indra/newview/llviewermessage.cpp
+++ b/linden/indra/newview/llviewermessage.cpp
@@ -262,6 +262,13 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
262 msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]); 262 msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]);
263 msg->sendReliable(LLHost(payload["sender"].asString())); 263 msg->sendReliable(LLHost(payload["sender"].asString()));
264 break; 264 break;
265 case 2:
266 // Push another notification
267 // Do we need to check for OfferFriendshipNoMessage here ever? -- MC
268 LLNotifications::instance().add("OfferFriendship", notification["substitutions"], notification["payload"]);
269 LLURLDispatcher::dispatch(llformat("secondlife:///app/agent/%s/about",payload["from_id"].asString().c_str()), NULL, true);
270 break;
271 case 3:
265 default: 272 default:
266 // close button probably, possibly timed out 273 // close button probably, possibly timed out
267 break; 274 break;
diff --git a/linden/indra/newview/llvlcomposition.cpp b/linden/indra/newview/llvlcomposition.cpp
index 535c504..afd9b95 100644
--- a/linden/indra/newview/llvlcomposition.cpp
+++ b/linden/indra/newview/llvlcomposition.cpp
@@ -73,10 +73,10 @@ LLVLComposition::LLVLComposition(LLSurface *surfacep, const U32 width, const F32
73 73
74 // Load Terrain Textures - Original ones 74 // Load Terrain Textures - Original ones
75 // Load from file as OpenSim-based grids don't include these yet -- MC 75 // Load from file as OpenSim-based grids don't include these yet -- MC
76 setDetailTextureID(0, TERRAIN_DIRT_DETAIL.asString()+".j2c", TRUE, TRUE); 76 setDetailTextureID(0, TERRAIN_DIRT_DETAIL.asString()+".j2c", TRUE, FALSE, 0, 0, TERRAIN_DIRT_DETAIL);
77 setDetailTextureID(1, TERRAIN_GRASS_DETAIL.asString()+".j2c", TRUE, TRUE); 77 setDetailTextureID(1, TERRAIN_GRASS_DETAIL.asString()+".j2c", TRUE, FALSE, 0, 0, TERRAIN_GRASS_DETAIL);
78 setDetailTextureID(2, TERRAIN_MOUNTAIN_DETAIL.asString()+".j2c", TRUE, TRUE); 78 setDetailTextureID(2, TERRAIN_MOUNTAIN_DETAIL.asString()+".j2c", TRUE, FALSE, 0, 0, TERRAIN_MOUNTAIN_DETAIL);
79 setDetailTextureID(3, TERRAIN_ROCK_DETAIL.asString()+".j2c", TRUE, TRUE); 79 setDetailTextureID(3, TERRAIN_ROCK_DETAIL.asString()+".j2c", TRUE, FALSE, 0, 0, TERRAIN_ROCK_DETAIL);
80 80
81 // Initialize the texture matrix to defaults. 81 // Initialize the texture matrix to defaults.
82 for (S32 i = 0; i < CORNER_COUNT; ++i) 82 for (S32 i = 0; i < CORNER_COUNT; ++i)
@@ -112,13 +112,13 @@ void LLVLComposition::setDetailTextureID(S32 corner, const LLUUID& id)
112 mRawImages[corner] = NULL; 112 mRawImages[corner] = NULL;
113} 113}
114 114
115void LLVLComposition::setDetailTextureID(S32 corner, const std::string& filename, const bool& usemipmap, const bool& levelimmediate) 115void LLVLComposition::setDetailTextureID(S32 corner, const std::string& filename, const bool& usemipmap, const bool& levelimmediate, LLGLint internal_format, LLGLenum primary_format, const LLUUID& force_id)
116{ 116{
117 if(filename.empty()) 117 if(filename.empty())
118 { 118 {
119 return; 119 return;
120 } 120 }
121 mDetailTextures[corner] = gImageList.getImageFromFile(filename, usemipmap, levelimmediate); 121 mDetailTextures[corner] = gImageList.getImageFromFile(filename, usemipmap, levelimmediate, internal_format, primary_format, force_id);
122 mDetailTextures[corner]->setNoDelete() ; 122 mDetailTextures[corner]->setNoDelete() ;
123 mRawImages[corner] = NULL; 123 mRawImages[corner] = NULL;
124} 124}
diff --git a/linden/indra/newview/llvlcomposition.h b/linden/indra/newview/llvlcomposition.h
index 4ae296c..eb61bfd 100644
--- a/linden/indra/newview/llvlcomposition.h
+++ b/linden/indra/newview/llvlcomposition.h
@@ -67,7 +67,7 @@ public:
67 F32 getHeightRange(S32 corner); 67 F32 getHeightRange(S32 corner);
68 68
69 void setDetailTextureID(S32 corner, const LLUUID& id); 69 void setDetailTextureID(S32 corner, const LLUUID& id);
70 void setDetailTextureID(S32 corner, const std::string& filename, const bool& usemipmap, const bool& levelimmediate); 70 void setDetailTextureID(S32 corner, const std::string& filename, const bool& usemipmap, const bool& levelimmediate, LLGLint internal_format, LLGLenum primary_format, const LLUUID& force_id);
71 void setStartHeight(S32 corner, F32 start_height); 71 void setStartHeight(S32 corner, F32 start_height);
72 void setHeightRange(S32 corner, F32 range); 72 void setHeightRange(S32 corner, F32 range);
73 73
diff --git a/linden/indra/newview/llwindlightremotectrl.cpp b/linden/indra/newview/llwindlightremotectrl.cpp
index 5a6b35d..b9111d3 100644
--- a/linden/indra/newview/llwindlightremotectrl.cpp
+++ b/linden/indra/newview/llwindlightremotectrl.cpp
@@ -121,6 +121,7 @@ BOOL LLWindlightRemoteCtrl::postBuild()
121 LLComboBox* presetsCombo = getChild<LLComboBox>("Presets"); 121 LLComboBox* presetsCombo = getChild<LLComboBox>("Presets");
122 if (presetsCombo) 122 if (presetsCombo)
123 { 123 {
124 presetsCombo->setSimple(LLWLParamManager::instance()->mCurParams.mName);
124 presetsCombo->setCommitCallback(onCommitPreset); 125 presetsCombo->setCommitCallback(onCommitPreset);
125 presetsCombo->setCallbackUserData(this); 126 presetsCombo->setCallbackUserData(this);
126 127
diff --git a/linden/indra/newview/panelradar.cpp b/linden/indra/newview/panelradar.cpp
index 8ff5fad..a868ee2 100644
--- a/linden/indra/newview/panelradar.cpp
+++ b/linden/indra/newview/panelradar.cpp
@@ -114,7 +114,9 @@ bool PanelRadar::isImpDev(const LLUUID& agent_id)
114 std::string agent_name = getSelectedName(agent_id); 114 std::string agent_name = getSelectedName(agent_id);
115 return (agent_name == "McCabe Maxsted" || 115 return (agent_name == "McCabe Maxsted" ||
116 agent_name == "Jacek Antonelli" || 116 agent_name == "Jacek Antonelli" ||
117 agent_name == "Armin Weatherwax"); 117 agent_name == "Armin Weatherwax" ||
118 agent_name == "Elektra Hesse" ||
119 agent_name == "CodeBastard Redgrave");
118} 120}
119 121
120void PanelRadar::updateRadarInfo() 122void PanelRadar::updateRadarInfo()
diff --git a/linden/indra/newview/qtoolalign.cpp b/linden/indra/newview/qtoolalign.cpp
new file mode 100644
index 0000000..d7f7ad0
--- /dev/null
+++ b/linden/indra/newview/qtoolalign.cpp
@@ -0,0 +1,585 @@
1/**
2 * @file qtoolalign.cpp
3 * @brief A tool to align objects
4 * @author Karl Stiefvater (Qarl)
5 *
6 * Karl has given permission to use this code under the terms of
7 * the GNU GPL v2 plus FLOSS exception and/or the GNU LGPL v2.1.
8 *
9 * Backported for Viewer 1.X code base by Jacek Antonelli.
10 */
11
12#include "llviewerprecompiledheaders.h"
13
14// File includes
15#include "qtoolalign.h"
16
17// Library includes
18#include "llbbox.h"
19#include "v3math.h"
20
21// Viewer includes
22#include "llagent.h"
23#include "llbox.h"
24#include "llcylinder.h"
25#include "llfloatertools.h"
26#include "llselectmgr.h"
27#include "llviewercamera.h"
28#include "llviewercontrol.h"
29#include "llviewerobject.h"
30#include "llviewerwindow.h"
31
32
33const F32 MANIPULATOR_SIZE = 5.0;
34const F32 MANIPULATOR_SELECT_SIZE = 20.0;
35
36
37
38QToolAlign::QToolAlign()
39: LLTool(std::string("Align"))
40{
41}
42
43
44QToolAlign::~QToolAlign()
45{
46}
47
48
49
50BOOL QToolAlign::handleMouseDown(S32 x, S32 y, MASK mask)
51{
52 if (mHighlightedAxis != -1)
53 {
54 align();
55 }
56 else
57 {
58 gViewerWindow->pickAsync(x, y, mask, pickCallback);
59 }
60
61 return TRUE;
62}
63
64
65
66void QToolAlign::pickCallback(const LLPickInfo& pick_info)
67{
68 LLViewerObject* object = pick_info.getObject();
69
70 if (object)
71 {
72 if (object->isAvatar())
73 {
74 return;
75 }
76
77 if (pick_info.mKeyMask & MASK_SHIFT)
78 {
79 // If object not selected, select it
80 if ( !object->isSelected() )
81 {
82 LLSelectMgr::getInstance()->selectObjectAndFamily(object);
83 }
84 else
85 {
86 LLSelectMgr::getInstance()->deselectObjectAndFamily(object);
87 }
88 }
89 else
90 {
91 LLSelectMgr::getInstance()->deselectAll();
92 LLSelectMgr::getInstance()->selectObjectAndFamily(object);
93 }
94
95 }
96 else
97 {
98 if (!(pick_info.mKeyMask == MASK_SHIFT))
99 {
100 LLSelectMgr::getInstance()->deselectAll();
101 }
102 }
103
104 LLSelectMgr::getInstance()->promoteSelectionToRoot();
105}
106
107
108
109void QToolAlign::handleSelect()
110{
111 // no parts, please
112
113 llwarns << "in select" << llendl;
114 LLSelectMgr::getInstance()->promoteSelectionToRoot();
115}
116
117
118void QToolAlign::handleDeselect()
119{
120}
121
122
123BOOL QToolAlign::findSelectedManipulator(S32 x, S32 y)
124{
125 mHighlightedAxis = -1;
126 mHighlightedDirection = 0;
127
128 LLMatrix4 transform;
129 if (LLSelectMgr::getInstance()->getSelection()->getSelectType() == SELECT_TYPE_HUD)
130 {
131 LLVector4 translation(mBBox.getCenterAgent());
132 transform.initRotTrans(mBBox.getRotation(), translation);
133 LLMatrix4 cfr(OGL_TO_CFR_ROTATION);
134 transform *= cfr;
135 LLMatrix4 window_scale;
136 F32 zoom_level = 2.f * gAgent.mHUDCurZoom;
137 window_scale.initAll(LLVector3(zoom_level / LLViewerCamera::getInstance()->getAspect(), zoom_level, 0.f),
138 LLQuaternion::DEFAULT,
139 LLVector3::zero);
140 transform *= window_scale;
141 }
142 else
143 {
144 transform.initAll(LLVector3(1.f, 1.f, 1.f), mBBox.getRotation(), mBBox.getCenterAgent());
145
146 LLMatrix4 projection_matrix = LLViewerCamera::getInstance()->getProjection();
147 LLMatrix4 model_matrix = LLViewerCamera::getInstance()->getModelview();
148
149 transform *= model_matrix;
150 transform *= projection_matrix;
151 }
152
153
154 //LLRect world_view_rect = getWorldViewRectScaled();
155 F32 half_width = (F32)gViewerWindow->getWindowWidth() / 2.f;
156 F32 half_height = (F32)gViewerWindow->getWindowHeight() / 2.f;
157 LLVector2 manip2d;
158 LLVector2 mousePos((F32)x - half_width, (F32)y - half_height);
159 LLVector2 delta;
160
161 LLVector3 bbox_scale = mBBox.getMaxLocal() - mBBox.getMinLocal();
162
163 for (S32 axis = VX; axis <= VZ; axis++)
164 {
165 for (F32 direction = -1.0; direction <= 1.0; direction += 2.0)
166 {
167 LLVector3 axis_vector = LLVector3(0,0,0);
168 axis_vector.mV[axis] = direction * bbox_scale.mV[axis] / 2.0;
169
170 LLVector4 manipulator_center = LLVector4(axis_vector);
171
172 LLVector4 screen_center = manipulator_center * transform;
173 screen_center /= screen_center.mV[VW];
174
175 manip2d.setVec(screen_center.mV[VX] * half_width, screen_center.mV[VY] * half_height);
176
177 delta = manip2d - mousePos;
178
179 if (delta.magVecSquared() < MANIPULATOR_SELECT_SIZE * MANIPULATOR_SELECT_SIZE)
180 {
181 mHighlightedAxis = axis;
182 mHighlightedDirection = direction;
183 return TRUE;
184 }
185
186 }
187 }
188
189 return FALSE;
190}
191
192
193BOOL QToolAlign::handleHover(S32 x, S32 y, MASK mask)
194{
195 if (mask & MASK_SHIFT)
196 {
197 mForce = FALSE;
198 }
199 else
200 {
201 mForce = TRUE;
202 }
203
204 gViewerWindow->setCursor(UI_CURSOR_ARROW);
205 return findSelectedManipulator(x, y);
206}
207
208
209
210void setup_transforms_bbox(LLBBox bbox)
211{
212 // translate to center
213 LLVector3 center = bbox.getCenterAgent();
214 gGL.translatef(center.mV[VX], center.mV[VY], center.mV[VZ]);
215
216 // rotate
217 LLQuaternion rotation = bbox.getRotation();
218 F32 angle_radians, x, y, z;
219 rotation.getAngleAxis(&angle_radians, &x, &y, &z);
220 // gGL has no rotate method (despite having translate and scale) presumably because
221 // its authors smoke crack. so we hack.
222 gGL.flush();
223 glRotatef(angle_radians * RAD_TO_DEG, x, y, z);
224
225 // scale
226 LLVector3 scale = bbox.getMaxLocal() - bbox.getMinLocal();
227 gGL.scalef(scale.mV[VX], scale.mV[VY], scale.mV[VZ]);
228}
229
230
231void render_bbox(LLBBox bbox)
232{
233 glMatrixMode(GL_MODELVIEW);
234 gGL.pushMatrix();
235
236 setup_transforms_bbox(bbox);
237
238 gGL.flush();
239 gBox.render();
240
241 gGL.popMatrix();
242}
243
244void render_cone_bbox(LLBBox bbox)
245{
246 glMatrixMode(GL_MODELVIEW);
247 gGL.pushMatrix();
248
249 setup_transforms_bbox(bbox);
250
251 gGL.flush();
252 gCone.render(CONE_LOD_HIGHEST);
253
254 gGL.popMatrix();
255}
256
257
258
259// the selection bbox isn't axis aligned, so we must construct one
260// should this be cached in the selection manager? yes.
261LLBBox get_selection_axis_aligned_bbox()
262{
263 LLBBox selection_bbox = LLSelectMgr::getInstance()->getBBoxOfSelection();
264 LLVector3 position = selection_bbox.getPositionAgent();
265
266 LLBBox axis_aligned_bbox = LLBBox(position, LLQuaternion(), LLVector3(), LLVector3());
267 axis_aligned_bbox.addPointLocal(LLVector3());
268
269 // cycle over the nodes in selection
270 for (LLObjectSelection::iterator selection_iter = LLSelectMgr::getInstance()->getSelection()->begin();
271 selection_iter != LLSelectMgr::getInstance()->getSelection()->end();
272 ++selection_iter)
273 {
274 LLSelectNode *select_node = *selection_iter;
275 if (select_node)
276 {
277 LLViewerObject* object = select_node->getObject();
278 if (object)
279 {
280 axis_aligned_bbox.addBBoxAgent(object->getBoundingBoxAgent());
281 }
282 }
283 }
284
285
286 return axis_aligned_bbox;
287}
288
289
290
291void QToolAlign::computeManipulatorSize()
292{
293 if (LLSelectMgr::getInstance()->getSelection()->getSelectType() == SELECT_TYPE_HUD)
294 {
295 mManipulatorSize = MANIPULATOR_SIZE / (LLViewerCamera::getInstance()->getViewHeightInPixels() *
296 gAgent.mHUDCurZoom);
297 }
298 else
299 {
300 F32 distance = dist_vec(gAgent.getCameraPositionAgent(), mBBox.getCenterAgent());
301
302 if (distance > 0.001f)
303 {
304 // range != zero
305 F32 fraction_of_fov = MANIPULATOR_SIZE /LLViewerCamera::getInstance()->getViewHeightInPixels();
306 F32 apparent_angle = fraction_of_fov * LLViewerCamera::getInstance()->getView(); // radians
307 mManipulatorSize = MANIPULATOR_SIZE * distance * tan(apparent_angle);
308 }
309 else
310 {
311 // range == zero
312 mManipulatorSize = MANIPULATOR_SIZE;
313 }
314 }
315}
316
317
318LLColor4 manipulator_color[3] = { LLColor4(0.7f, 0.0f, 0.0f, 0.5f),
319 LLColor4(0.0f, 0.7f, 0.0f, 0.5f),
320 LLColor4(0.0f, 0.0f, 0.7f, 0.5f) };
321
322
323void QToolAlign::renderManipulators()
324{
325 computeManipulatorSize();
326 LLVector3 bbox_center = mBBox.getCenterAgent();
327 LLVector3 bbox_scale = mBBox.getMaxLocal() - mBBox.getMinLocal();
328
329 for (S32 axis = VX; axis <= VZ; axis++)
330 for (F32 direction = -1.0; direction <= 1.0; direction += 2.0)
331 {
332 F32 size = mManipulatorSize;
333 LLColor4 color = manipulator_color[axis];
334
335 if ((axis == mHighlightedAxis) && (direction == mHighlightedDirection))
336 {
337 size *= 2.0;
338 color *= 1.5;
339 }
340
341 S32 arrows = 1;
342 if (mForce)
343 {
344 arrows = 2;
345 }
346
347 for (S32 i = 0; i < arrows; i++)
348 {
349 LLVector3 axis_vector = LLVector3(0,0,0);
350 axis_vector.mV[axis] = direction * (bbox_scale.mV[axis] / 2.0 + i * (size/3.0));
351
352 LLVector3 manipulator_center = bbox_center + axis_vector;
353
354 LLQuaternion manipulator_rotation;
355 manipulator_rotation.shortestArc(LLVector3(0,0,1), -1.0 * axis_vector);
356
357 LLBBox manipulator_bbox = LLBBox(manipulator_center, manipulator_rotation,
358 LLVector3(), LLVector3());
359
360 manipulator_bbox.addPointLocal(LLVector3(-1, -1, -0.75) * size * 0.5);
361 manipulator_bbox.addPointLocal(LLVector3(1, 1, 0.75) * size * 0.5);
362
363 gGL.color4fv(color.mV);
364 // sadly, gCone doesn't use gGL like gBox does (presumably because its author smokes crack) so we
365 // also set the raw GL color. hopefully this won't screw-up later rendering.
366 glColor4fv(color.mV);
367
368 render_cone_bbox(manipulator_bbox);
369 }
370 }
371}
372
373
374void QToolAlign::render()
375{
376 mBBox = get_selection_axis_aligned_bbox();
377
378 // Draw bounding box
379 LLGLSUIDefault gls_ui;
380 LLGLEnable gl_blend(GL_BLEND);
381 LLGLEnable gls_alpha_test(GL_ALPHA_TEST);
382 LLGLDepthTest gls_depth(GL_FALSE);
383 gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
384
385 // render box
386 LLColor4 default_normal_color( 0.7f, 0.7f, 0.7f, 0.1f );
387 gGL.color4fv( default_normal_color.mV );
388
389 render_bbox(mBBox);
390 renderManipulators();
391}
392
393// only works for our specialized (AABB, position centered) bboxes
394BOOL bbox_overlap(LLBBox bbox1, LLBBox bbox2)
395{
396 const F32 FUDGE = 0.001f; // because of stupid SL precision/rounding
397
398 LLVector3 delta = bbox1.getCenterAgent() - bbox2.getCenterAgent();
399
400 LLVector3 half_extent = (bbox1.getExtentLocal() + bbox2.getExtentLocal()) / 2.0;
401
402 return ((fabs(delta.mV[VX]) < half_extent.mV[VX] - FUDGE) &&
403 (fabs(delta.mV[VY]) < half_extent.mV[VY] - FUDGE) &&
404 (fabs(delta.mV[VZ]) < half_extent.mV[VZ] - FUDGE));
405}
406
407
408
409// used to sort bboxes before packing
410class BBoxCompare
411{
412public:
413 BBoxCompare(S32 axis, F32 direction, std::map<LLPointer<LLViewerObject>, LLBBox >& bboxes) :
414 mAxis(axis), mDirection(direction), mBBoxes(bboxes) {}
415
416 BOOL operator() (LLViewerObject* object1, LLViewerObject* object2)
417 {
418 LLVector3 corner1 = mBBoxes[object1].getCenterAgent() -
419 mDirection * mBBoxes[object1].getExtentLocal()/2.0;
420
421 LLVector3 corner2 = mBBoxes[object2].getCenterAgent() -
422 mDirection * mBBoxes[object2].getExtentLocal()/2.0;
423
424
425 return mDirection * corner1.mV[mAxis] < mDirection * corner2.mV[mAxis];
426 }
427
428 S32 mAxis;
429 F32 mDirection;
430 std::map<LLPointer<LLViewerObject>, LLBBox >& mBBoxes;
431};
432
433
434void QToolAlign::align()
435{
436 // no linkset parts, please
437 LLSelectMgr::getInstance()->promoteSelectionToRoot();
438
439 std::vector<LLPointer<LLViewerObject> > objects;
440 std::map<LLPointer<LLViewerObject>, LLBBox > original_bboxes;
441
442 // cycle over the nodes in selection and collect them into an array
443 for (LLObjectSelection::root_iterator selection_iter = LLSelectMgr::getInstance()->getSelection()->root_begin();
444 selection_iter != LLSelectMgr::getInstance()->getSelection()->root_end();
445 ++selection_iter)
446 {
447 LLSelectNode *select_node = *selection_iter;
448 if (select_node)
449 {
450 LLViewerObject* object = select_node->getObject();
451 if (object)
452 {
453 LLVector3 position = object->getPositionAgent();
454
455 LLBBox bbox = LLBBox(position, LLQuaternion(), LLVector3(), LLVector3());
456 bbox.addPointLocal(LLVector3());
457
458 // add the parent's bbox
459 bbox.addBBoxAgent(object->getBoundingBoxAgent());
460 LLViewerObject::const_child_list_t& children = object->getChildren();
461
462 for (LLViewerObject::const_child_list_t::const_iterator i = children.begin();
463 i != children.end(); i++)
464 {
465 // add the child's bbox
466 LLViewerObject* child = *i;
467 bbox.addBBoxAgent(child->getBoundingBoxAgent());
468 }
469
470 objects.push_back(object);
471 original_bboxes[object] = bbox;
472 }
473 }
474 }
475
476 S32 axis = mHighlightedAxis;
477 F32 direction = mHighlightedDirection;
478
479 // sort them into positional order for proper packing
480 BBoxCompare compare(axis, direction, original_bboxes);
481 sort(objects.begin(), objects.end(), compare);
482
483 // storage for their new position after alignment - start with original position first
484 std::map<LLPointer<LLViewerObject>, LLBBox > new_bboxes = original_bboxes;
485
486 // find new positions
487 for (S32 i = 0; i < (S32)objects.size(); i++)
488 {
489 LLBBox target_bbox = mBBox;
490 LLVector3 target_corner = target_bbox.getCenterAgent() -
491 direction * target_bbox.getExtentLocal() / 2.0;
492
493 LLViewerObject* object = objects[i];
494
495 LLBBox this_bbox = original_bboxes[object];
496 LLVector3 this_corner = this_bbox.getCenterAgent() -
497 direction * this_bbox.getExtentLocal() / 2.0;
498
499 // for packing, we cycle over several possible positions, taking the smallest that does not overlap
500 F32 smallest = direction * 9999999; // 999999 guarenteed not to be the smallest
501 for (S32 j = 0; j <= i; j++)
502 {
503 // how far must it move?
504 LLVector3 delta = target_corner - this_corner;
505
506 // new position moves only on one axis, please
507 LLVector3 delta_one_axis = LLVector3(0,0,0);
508 delta_one_axis.mV[axis] = delta.mV[axis];
509
510 LLVector3 new_position = this_bbox.getCenterAgent() + delta_one_axis;
511
512 // construct the new bbox
513 LLBBox new_bbox = LLBBox(new_position, LLQuaternion(), LLVector3(), LLVector3());
514 new_bbox.addPointLocal(this_bbox.getExtentLocal() / 2.0);
515 new_bbox.addPointLocal(-1.0 * this_bbox.getExtentLocal() / 2.0);
516
517 // check to see if it overlaps the previously placed objects
518 BOOL overlap = FALSE;
519
520 llwarns << "i=" << i << " j=" << j << llendl;
521
522 if (!mForce) // well, don't check if in force mode
523 {
524 for (S32 k = 0; k < i; k++)
525 {
526 LLViewerObject* other_object = objects[k];
527 LLBBox other_bbox = new_bboxes[other_object];
528
529 BOOL overlaps_this = bbox_overlap(other_bbox, new_bbox);
530
531 if (overlaps_this)
532 {
533 llwarns << "overlap" << new_bbox.getCenterAgent() << other_bbox.getCenterAgent() << llendl;
534 llwarns << "extent" << new_bbox.getExtentLocal() << other_bbox.getExtentLocal() << llendl;
535 }
536
537 overlap = (overlap || overlaps_this);
538 }
539 }
540
541 if (!overlap)
542 {
543 F32 this_value = (new_bbox.getCenterAgent() -
544 direction * new_bbox.getExtentLocal() / 2.0).mV[axis];
545
546 if (direction * this_value < direction * smallest)
547 {
548 smallest = this_value;
549 // store it
550 new_bboxes[object] = new_bbox;
551 }
552 }
553
554 // update target for next time through the loop
555 if (j < (S32)objects.size())
556 {
557 LLBBox next_bbox = new_bboxes[objects[j]];
558 target_corner = next_bbox.getCenterAgent() +
559 direction * next_bbox.getExtentLocal() / 2.0;
560 }
561 }
562 }
563
564
565 // now move them
566 for (S32 i = 0; i < (S32)objects.size(); i++)
567 {
568 LLViewerObject* object = objects[i];
569
570 LLBBox original_bbox = original_bboxes[object];
571 LLBBox new_bbox = new_bboxes[object];
572
573 LLVector3 delta = new_bbox.getCenterAgent() - original_bbox.getCenterAgent();
574
575 LLVector3 original_position = object->getPositionAgent();
576 LLVector3 new_position = original_position + delta;
577
578 object->setPosition(new_position);
579 }
580
581
582 LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_POSITION);
583}
584
585
diff --git a/linden/indra/newview/qtoolalign.h b/linden/indra/newview/qtoolalign.h
new file mode 100644
index 0000000..b2c18b7
--- /dev/null
+++ b/linden/indra/newview/qtoolalign.h
@@ -0,0 +1,50 @@
1/**
2 * @file qtoolalign.h
3 * @brief A tool to align objects
4 * @author Karl Stiefvater (Qarl)
5 *
6 * Karl has given permission to use this code under the terms of
7 * the GNU GPL v2 plus FLOSS exception and/or the GNU LGPL v2.1.
8 *
9 * Backported for Viewer 1.X code base by Jacek Antonelli.
10 */
11
12#ifndef Q_QTOOLALIGN_H
13#define Q_QTOOLALIGN_H
14
15#include "lltool.h"
16#include "llbbox.h"
17
18class LLViewerObject;
19class LLPickInfo;
20class LLToolSelectRect;
21
22class QToolAlign
23: public LLTool, public LLSingleton<QToolAlign>
24{
25public:
26 QToolAlign();
27 virtual ~QToolAlign();
28
29 virtual void handleSelect();
30 virtual void handleDeselect();
31 virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
32 virtual BOOL handleHover(S32 x, S32 y, MASK mask);
33 virtual void render();
34
35 static void pickCallback(const LLPickInfo& pick_info);
36
37private:
38 void align();
39 void computeManipulatorSize();
40 void renderManipulators();
41 BOOL findSelectedManipulator(S32 x, S32 y);
42
43 LLBBox mBBox;
44 F32 mManipulatorSize;
45 S32 mHighlightedAxis;
46 F32 mHighlightedDirection;
47 BOOL mForce;
48};
49
50#endif // Q_QTOOLALIGN_H
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_teleport_history.xml b/linden/indra/newview/skins/default/xui/en-us/floater_teleport_history.xml
index db36df5..13956e2 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_teleport_history.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_teleport_history.xml
@@ -1,6 +1,6 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater can_close="true" can_drag_on_left="false" can_minimize="true" can_resize="true" 2<floater can_close="true" can_drag_on_left="false" can_minimize="true" can_resize="true"
3 min_width="500" min_height="250" width="500" height="250" name="teleporthistory" 3 min_width="600" min_height="250" width="600" height="250" name="teleporthistory"
4 rect_control="FloaterTeleportHistoryRect" title="Teleport History"> 4 rect_control="FloaterTeleportHistoryRect" title="Teleport History">
5 <tab_container label="TPlistTabs" bottom="40" height="185" left="5" follows="left|top|right|bottom" mouse_opaque="false" name="tplisttabs" 5 <tab_container label="TPlistTabs" bottom="40" height="185" left="5" follows="left|top|right|bottom" mouse_opaque="false" name="tplisttabs"
6 tab_min_width="50" tab_position="top" width="480" right="-10" bg_opaque_color="0,0,0,0.0"> 6 tab_min_width="50" tab_position="top" width="480" right="-10" bg_opaque_color="0,0,0,0.0">
@@ -39,6 +39,10 @@
39 height="20" label="Show On Map" label_selected="Show On Map" 39 height="20" label="Show On Map" label_selected="Show On Map"
40 left_delta="100" mouse_opaque="true" name="show_on_map" 40 left_delta="100" mouse_opaque="true" name="show_on_map"
41 tool_tip="Center map on this location" width="125" /> 41 tool_tip="Center map on this location" width="125" />
42 <button bottom_delta="0" enabled="true" follows="left|bottom" font="SansSerif" halign="center"
43 height="20" label="Clear History"
44 left_delta="135" mouse_opaque="true" name="clear_history"
45 tool_tip="Clear Saved Teleport History" width="125" />
42 <button bottom_delta="0" enabled="false" follows="bottom|right" font="SansSerif" 46 <button bottom_delta="0" enabled="false" follows="bottom|right" font="SansSerif"
43 height="20" label="Copy SLURL to clipboard" left="-190" name="copy_slurl" 47 height="20" label="Copy SLURL to clipboard" left="-190" name="copy_slurl"
44 tool_tip="Copies current location as SLURL to be used on the web." 48 tool_tip="Copies current location as SLURL to be used on the web."
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml b/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
index 0cb4a59..d7a2013 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_tools.xml
@@ -79,6 +79,10 @@
79 <check_box bottom_delta="-15" follows="left|top" font="SansSerifSmall" height="16" 79 <check_box bottom_delta="-15" follows="left|top" font="SansSerifSmall" height="16"
80 initial_value="false" label="Select faces to texture" left="4" mouse_opaque="true" 80 initial_value="false" label="Select faces to texture" left="4" mouse_opaque="true"
81 name="radio select face" radio_style="true" width="114" /> 81 name="radio select face" radio_style="true" width="114" />
82 <check_box bottom_delta="-15" follows="left|top" font="SansSerifSmall" height="16"
83 initial_value="false" label="Align (Shift to Pack)" left="4" mouse_opaque="true"
84 name="radio align" radio_style="true" width="114"
85 tool_tip="Align aligns all selected prims' edges along an axis, Pack moves all selected prims' edges so they're touching" />
82 <check_box bottom_delta="-19" control_name="EditLinkedParts" follows="left|top" 86 <check_box bottom_delta="-19" control_name="EditLinkedParts" follows="left|top"
83 font="SansSerifSmall" height="16" initial_value="false" 87 font="SansSerifSmall" height="16" initial_value="false"
84 label="Edit linked parts" left="4" mouse_opaque="true" 88 label="Edit linked parts" left="4" mouse_opaque="true"
@@ -321,6 +325,12 @@
321 mouse_opaque="true" name="prim_count" v_pad="0" width="143"> 325 mouse_opaque="true" name="prim_count" v_pad="0" width="143">
322 Primitives: [COUNT] 326 Primitives: [COUNT]
323 </text> 327 </text>
328 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
329 bottom="-168" left="118" drop_shadow_visible="true" follows="left|top"
330 font="SansSerifSmall" h_pad="0" halign="right" height="16"
331 mouse_opaque="true" name="link_num" v_pad="0" width="143">
332 Link number: [NUMBER]
333 </text>
324 334
325<!-- Sub-tabs --> 335<!-- Sub-tabs -->
326 336
@@ -1085,7 +1095,7 @@
1085 Glow: 1095 Glow:
1086 </text> 1096 </text>
1087 <spinner bottom_delta="-20" decimal_digits="2" follows="left|top" height="16" 1097 <spinner bottom_delta="-20" decimal_digits="2" follows="left|top" height="16"
1088 increment="0.1" initial_val="0" left="180" max_val="1" 1098 increment="0.05" initial_val="0" left="180" max_val="1"
1089 min_val="0" mouse_opaque="true" name="glow" width="58" /> 1099 min_val="0" mouse_opaque="true" name="glow" width="58" />
1090 <check_box bottom_delta="-23" follows="left|top" font="SansSerifSmall" height="16" 1100 <check_box bottom_delta="-23" follows="left|top" font="SansSerifSmall" height="16"
1091 initial_value="false" label="Full bright" left="180" mouse_opaque="true" 1101 initial_value="false" label="Full bright" left="180" mouse_opaque="true"
@@ -1202,13 +1212,13 @@
1202 mouse_opaque="true" name="tex scale" v_pad="0" width="160"> 1212 mouse_opaque="true" name="tex scale" v_pad="0" width="160">
1203 Repeats Per Face: 1213 Repeats Per Face:
1204 </text> 1214 </text>
1205 <spinner bottom="-178" decimal_digits="3" follows="left|top" height="16" increment="0.1" 1215 <spinner bottom="-178" decimal_digits="3" follows="left|top" height="16" increment="0.05"
1206 initial_val="0" label="Horizontal (U):" label_width="90" left="20" 1216 initial_val="0" label="Horizontal (U):" label_width="90" left="20"
1207 max_val="10000" min_val="0" mouse_opaque="true" name="TexScaleU" width="160" /> 1217 max_val="10000" min_val="0" mouse_opaque="true" name="TexScaleU" width="160" />
1208 <check_box bottom="-179" follows="left|top" font="SansSerifSmall" height="16" 1218 <check_box bottom="-179" follows="left|top" font="SansSerifSmall" height="16"
1209 initial_value="false" label="Flip" left_delta="170" mouse_opaque="true" 1219 initial_value="false" label="Flip" left_delta="170" mouse_opaque="true"
1210 name="checkbox flip s" width="70" /> 1220 name="checkbox flip s" width="70" />
1211 <spinner bottom="-196" decimal_digits="3" follows="left|top" height="16" increment="0.1" 1221 <spinner bottom="-196" decimal_digits="3" follows="left|top" height="16" increment="0.05"
1212 initial_val="0" label="Vertical (V):" label_width="90" left="20" 1222 initial_val="0" label="Vertical (V):" label_width="90" left="20"
1213 max_val="10000" min_val="0" mouse_opaque="true" name="TexScaleV" width="160" /> 1223 max_val="10000" min_val="0" mouse_opaque="true" name="TexScaleV" width="160" />
1214 <check_box bottom="-197" follows="left|top" font="SansSerifSmall" height="16" 1224 <check_box bottom="-197" follows="left|top" font="SansSerifSmall" height="16"
@@ -1247,11 +1257,11 @@
1247 mouse_opaque="true" name="tex offset" v_pad="0" width="160"> 1257 mouse_opaque="true" name="tex offset" v_pad="0" width="160">
1248 Offset: 1258 Offset:
1249 </text> 1259 </text>
1250 <spinner bottom="-308" decimal_digits="3" follows="left|top" height="16" increment="0.1" 1260 <spinner bottom="-308" decimal_digits="3" follows="left|top" height="16" increment="0.05"
1251 initial_val="0" label="Horizontal (U):" label_width="90" left="20" 1261 initial_val="0" label="Horizontal (U):" label_width="90" left="20"
1252 max_val="1" min_val="-1" mouse_opaque="true" name="TexOffsetU" width="160" /> 1262 max_val="1" min_val="-1" mouse_opaque="true" name="TexOffsetU" width="160" />
1253 <spinner bottom_delta="-18" decimal_digits="3" follows="left|top" height="16" 1263 <spinner bottom_delta="-18" decimal_digits="3" follows="left|top" height="16"
1254 increment="0.1" initial_val="0" label="Vertical (V):" label_width="90" 1264 increment="0.05" initial_val="0" label="Vertical (V):" label_width="90"
1255 left="20" max_val="1" min_val="-1" mouse_opaque="true" name="TexOffsetV" 1265 left="20" max_val="1" min_val="-1" mouse_opaque="true" name="TexOffsetV"
1256 width="160" /> 1266 width="160" />
1257 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 1267 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
diff --git a/linden/indra/newview/skins/default/xui/en-us/fonts.xml b/linden/indra/newview/skins/default/xui/en-us/fonts.xml
index 5564079..7343ac2 100644
--- a/linden/indra/newview/skins/default/xui/en-us/fonts.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/fonts.xml
@@ -153,7 +153,7 @@
153 /> 153 />
154 <font_size name="Small" 154 <font_size name="Small"
155 comment="Size of small font (points, or 1/72 of an inch)" 155 comment="Size of small font (points, or 1/72 of an inch)"
156 size="8" 156 size="8.5"
157 /> 157 />
158</fonts> 158</fonts>
159 159
diff --git a/linden/indra/newview/skins/default/xui/en-us/notifications.xml b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
index d7b078c..0ac7401 100644
--- a/linden/indra/newview/skins/default/xui/en-us/notifications.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/notifications.xml
@@ -902,32 +902,32 @@ Would you like to disable all popups which can be skipped?
902</notification> 902</notification>
903 903
904<notification 904<notification
905 icon="alertmodal.tga" 905 icon="notify.tga"
906 name="CacheWillClear" 906 name="CacheWillClear"
907 type="alertmodal"> 907 type="notify">
908Cache will be cleared after you restart [VIEWER_NAME]. 908Cache will be cleared after you restart [VIEWER_NAME].
909</notification> 909</notification>
910 910
911<notification 911<notification
912 icon="alertmodal.tga" 912 icon="notify.tga"
913 name="CacheWillBeMoved" 913 name="CacheWillBeMoved"
914 type="alertmodal"> 914 type="notify">
915Cache will be moved after you restart [VIEWER_NAME]. 915Cache will be moved after you restart [VIEWER_NAME].
916 916
917Note: This will clear the cache. 917Note: This will clear the cache.
918</notification> 918</notification>
919 919
920<notification 920<notification
921 icon="alertmodal.tga" 921 icon="notify.tga"
922 name="ChangeConnectionPort" 922 name="ChangeConnectionPort"
923 type="alertmodal"> 923 type="notify">
924Port settings take effect after you restart [VIEWER_NAME]. 924Port settings take effect after you restart [VIEWER_NAME].
925</notification> 925</notification>
926 926
927<notification 927<notification
928 icon="alertmodal.tga" 928 icon="notify.tga"
929 name="ChangeSkin" 929 name="ChangeSkin"
930 type="alertmodal"> 930 type="notify">
931The new skin will appear after you restart [VIEWER_NAME]. 931The new skin will appear after you restart [VIEWER_NAME].
932</notification> 932</notification>
933 933
@@ -6009,8 +6009,12 @@ An object named [OBJECTFROMNAME] owned by (an unknown user) has given you a [OBJ
6009 index="1" 6009 index="1"
6010 name="Decline" 6010 name="Decline"
6011 text="Decline"/> 6011 text="Decline"/>
6012 <button
6013 index="2"
6014 name="Profile"
6015 text="Profile"/>
6012 <button 6016 <button
6013 index="2" 6017 index="3"
6014 name="Ignore" 6018 name="Ignore"
6015 text="Ignore"/> 6019 text="Ignore"/>
6016 </form> 6020 </form>
@@ -6033,7 +6037,11 @@ An object named [OBJECTFROMNAME] owned by (an unknown user) has given you a [OBJ
6033 name="Decline" 6037 name="Decline"
6034 text="Decline"/> 6038 text="Decline"/>
6035 <button 6039 <button
6036 index="2" 6040 index="2"
6041 name="Profile"
6042 text="Profile"/>
6043 <button
6044 index="3"
6037 name="Ignore" 6045 name="Ignore"
6038 text="Ignore"/> 6046 text="Ignore"/>
6039 </form> 6047 </form>
@@ -7000,6 +7008,7 @@ IM history could not be found for [NAME].
7000 type="alert"> 7008 type="alert">
7001Show Look At is a debug setting that displays where an avatar's head is looking. Be aware: this will *NOT* show where an avatar's camera is actually pointed. This setting should not be relied on for any form of privacy! 7009Show Look At is a debug setting that displays where an avatar's head is looking. Be aware: this will *NOT* show where an avatar's camera is actually pointed. This setting should not be relied on for any form of privacy!
7002 <usetemplate 7010 <usetemplate
7011 ignoretext="When setting Show Look At"
7003 name="okignore" 7012 name="okignore"
7004 yestext="OK"/> 7013 yestext="OK"/>
7005</notification> 7014</notification>
@@ -7095,8 +7104,8 @@ Apply this region's settings? (&quot;Ignore&quot; will ignore all region setting
7095 7104
7096<notification 7105<notification
7097 name="ChangeFont" 7106 name="ChangeFont"
7098 icon="alertmodal.tga" 7107 icon="notify.tga"
7099 type="alertmodal"> 7108 type="notify">
7100The new font will appear after you restart [VIEWER_NAME]. 7109The new font will appear after you restart [VIEWER_NAME].
7101</notification> 7110</notification>
7102 7111
diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml
index 5865bec..c64ce9f 100644
--- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_fonts.xml
@@ -46,4 +46,14 @@
46 Preview: The quick brown fox jumped over the lazy dog. :) 46 Preview: The quick brown fox jumped over the lazy dog. :)
47 </text> 47 </text>
48 48
49
50 <spinner name="font_mult" label="Font size multiplier:" label_width="130"
51 bottom="-280" left="20" height="16" width="180" follows="left|top"
52 decimal_digits="2" increment="0.01" max_val="3.0" min_val="0.1"
53 tool_tip="Multiply all font sizes by this amount." />
54
55 <check_box name="font_round" follows="left|top"
56 bottom="-300" left="20" height="16" width="300"
57 label="Force integer font sizes (may fix blurry fonts)" />
58
49</panel> 59</panel>