summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llcharacter/llmotioncontroller.cpp1
-rw-r--r--indra/llcommon/llmemory.h8
-rw-r--r--indra/llcommon/llpreprocessor.h7
-rw-r--r--indra/llcommon/llprocessor.cpp216
-rw-r--r--indra/llcommon/llsys.cpp43
-rw-r--r--indra/llcommon/llsys.h1
-rw-r--r--indra/llmath/m4math.cpp66
-rw-r--r--indra/llmath/m4math.h21
-rw-r--r--indra/llmath/v4math.h11
-rw-r--r--indra/llmessage/llclassifiedflags.h2
-rw-r--r--indra/llmessage/message.cpp118
-rw-r--r--indra/llmessage/message.h34
-rw-r--r--indra/llrender/llimagegl.cpp11
-rw-r--r--indra/llrender/llimagegl.h3
-rw-r--r--indra/llui/llbutton.cpp25
-rw-r--r--indra/llui/llbutton.h4
-rw-r--r--indra/llui/lltabcontainer.cpp132
-rw-r--r--indra/llui/lltabcontainer.h4
-rw-r--r--indra/llui/lltextbox.cpp2
-rw-r--r--indra/llui/llui.cpp15
-rw-r--r--indra/llui/llui.h3
-rw-r--r--indra/lscript/lscript_compile/lscript_tree.cpp1
-rw-r--r--indra/lscript/lscript_execute/lscript_execute.cpp1
-rw-r--r--indra/newview/featuretable.txt21
-rw-r--r--indra/newview/gpu_table.txt2
-rw-r--r--indra/newview/linux_tools/client-readme.txt50
-rw-r--r--indra/newview/lldrawable.cpp20
-rw-r--r--indra/newview/lldrawable.h3
-rw-r--r--indra/newview/lldrawpoolavatar.cpp12
-rw-r--r--indra/newview/lldrawpoolbump.cpp11
-rw-r--r--indra/newview/llfeaturemanager.cpp23
-rw-r--r--indra/newview/llfloaterabout.cpp2
-rw-r--r--indra/newview/llfloateravatartextures.cpp11
-rw-r--r--indra/newview/llfloaterfriends.cpp35
-rw-r--r--indra/newview/llfloaterfriends.h9
-rw-r--r--indra/newview/llhudrender.cpp9
-rw-r--r--indra/newview/llnetmap.cpp2
-rw-r--r--indra/newview/llpanelavatar.cpp33
-rw-r--r--indra/newview/llpanelavatar.h2
-rw-r--r--indra/newview/llpanellogin.cpp2
-rw-r--r--indra/newview/llpreviewtexture.cpp2
-rw-r--r--indra/newview/llspatialpartition.cpp58
-rw-r--r--indra/newview/llstartup.cpp13
-rw-r--r--indra/newview/llsurfacepatch.cpp5
-rw-r--r--indra/newview/llviewercamera.cpp2
-rw-r--r--indra/newview/llviewercamera.h1
-rw-r--r--indra/newview/llviewerdisplay.cpp9
-rw-r--r--indra/newview/llviewerjointmesh.cpp166
-rw-r--r--indra/newview/llviewermenu.cpp7
-rw-r--r--indra/newview/llviewermessage.cpp12
-rw-r--r--indra/newview/llviewerobject.cpp7
-rw-r--r--indra/newview/llviewerpartsim.cpp28
-rw-r--r--indra/newview/llviewertexteditor.cpp10
-rw-r--r--indra/newview/llviewerwindow.cpp19
-rw-r--r--indra/newview/llviewerwindow.h6
-rw-r--r--indra/newview/llvlcomposition.cpp2
-rw-r--r--indra/newview/llvoavatar.cpp6
-rw-r--r--indra/newview/llvosky.cpp12
-rw-r--r--indra/newview/llvosky.h17
-rw-r--r--indra/newview/llvosurfacepatch.cpp22
-rw-r--r--indra/newview/llvovolume.cpp47
-rw-r--r--indra/newview/pipeline.cpp28
-rw-r--r--indra/newview/pipeline.h1
63 files changed, 833 insertions, 623 deletions
diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp
index b1fc20bf32..71bbdfb932 100644
--- a/indra/llcharacter/llmotioncontroller.cpp
+++ b/indra/llcharacter/llmotioncontroller.cpp
@@ -790,6 +790,7 @@ BOOL LLMotionController::activateMotion(LLMotion *motion, F32 time)
motion->mSendStopTimestamp = F32_MAX;
}
+ mActiveMotions.remove(motion); // in case it is already in the active list
mActiveMotions.push_front(motion);
motion->activate();
diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h
index 2a58db659e..1253d34a7d 100644
--- a/indra/llcommon/llmemory.h
+++ b/indra/llcommon/llmemory.h
@@ -174,6 +174,14 @@ public:
}
return *this;
}
+
+ // Just exchange the pointers, which will not change the reference counts.
+ static void swap(LLPointer<Type>& a, LLPointer<Type>& b)
+ {
+ Type* temp = a.mPointer;
+ a.mPointer = b.mPointer;
+ b.mPointer = temp;
+ }
protected:
void ref()
diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h
index aaecbf3ddc..0882472242 100644
--- a/indra/llcommon/llpreprocessor.h
+++ b/indra/llcommon/llpreprocessor.h
@@ -22,6 +22,13 @@
#define LL_BIG_ENDIAN 1
#endif
+// Per-compiler switches
+#ifdef __GNUC__
+#define LL_FORCE_INLINE inline __attribute__((always_inline))
+#else
+#define LL_FORCE_INLINE __forceinline
+#endif
+
// Per-OS feature switches.
#if LL_DARWIN
diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp
index a941941fa8..0e469e6341 100644
--- a/indra/llcommon/llprocessor.cpp
+++ b/indra/llcommon/llprocessor.cpp
@@ -84,6 +84,7 @@ static void _Delay(unsigned int ms)
CProcessor::CProcessor()
{
uqwFrequency = 0;
+ strCPUName[0] = 0;
memset(&CPUInfo, 0, sizeof(CPUInfo));
}
@@ -226,77 +227,44 @@ bool CProcessor::AnalyzeIntelProcessor()
CPUInfo.uiType = (eaxreg >> 12) & 0x3;
CPUInfo.uiBrandID = ebxreg & 0xF;
- // Now we can translate the type number to a more understandable string format
- switch (CPUInfo.uiType)
+ static const char* INTEL_BRAND[] =
{
- case 0: // Type = 0: Original OEM processor
- strcpy(CPUInfo.strType, "Original OEM"); /* Flawfinder: ignore */
- strcpy(strCPUName, CPUInfo.strType); /* Flawfinder: ignore */
- strcat(strCPUName, " "); /* Flawfinder: ignore */
- break;
- case 1: // Type = 1: Overdrive processor
- strcpy(CPUInfo.strType, "Overdrive"); /* Flawfinder: ignore */
- strcpy(strCPUName, CPUInfo.strType); /* Flawfinder: ignore */
- strcat(strCPUName, " "); /* Flawfinder: ignore */
- break;
- case 2: // Type = 2: Dual-capable processor
- strcpy(CPUInfo.strType, "Dual-capable"); /* Flawfinder: ignore */
- strcpy(strCPUName, CPUInfo.strType); /* Flawfinder: ignore */
- strcat(strCPUName, " "); /* Flawfinder: ignore */
- break;
- case 3: // Type = 3: Reserved for future use
- strcpy(CPUInfo.strType, "Reserved"); /* Flawfinder: ignore */
- break;
- default: // This should be never called, cause we just mask 2 bits --> [0..3]
- strcpy(CPUInfo.strType, "Unknown"); /* Flawfinder: ignore */
- break;
- }
-
- // Then we translate the brand id:
- switch (CPUInfo.uiBrandID)
+ /* 0x00 */ "",
+ /* 0x01 */ "0.18 micron Intel Celeron",
+ /* 0x02 */ "0.18 micron Intel Pentium III",
+ /* 0x03 */ "0.13 micron Intel Celeron",
+ /* 0x04 */ "0.13 micron Intel Pentium III",
+ /* 0x05 */ "",
+ /* 0x06 */ "0.13 micron Intel Pentium III mobile",
+ /* 0x07 */ "0.13 micron Intel Celeron mobile",
+ /* 0x08 */ "0.18 micron Intel Pentium 4",
+ /* 0x09 */ "0.13 micron Intel Pentium 4",
+ /* 0x0A */ "0.13 micron Intel Pentium 4",
+ /* 0x0B */ "0.13 micron Intel Pentium 4 Xeon",
+ /* 0x0C */ "",
+ /* 0x0D */ "",
+ /* 0x0E */ "0.18 micron Intel Pentium 4 Xeon",
+ /* 0x0F */ "",
+ /* 0x10 */ "",
+ /* 0x11 */ "",
+ /* 0x12 */ "Intel Celeron M",
+ /* 0x13 */ "mobile Intel Celeron",
+ /* 0x14 */ "Intel Celeron",
+ /* 0x15 */ "mobile Intel",
+ /* 0x16 */ "Intel Pentium M",
+ /* 0x17 */ "mobile Intel Celeron",
+ };
+
+ // Only override the brand if we have it in the lookup table. We should
+ // already have a string here from GetCPUInfo(). JC
+ if (CPUInfo.uiBrandID < sizeof(INTEL_BRAND))
{
- case 0: // Brand id = 0: Brand id not supported on this processor
- strcpy(CPUInfo.strBrandID, "Not supported"); /* Flawfinder: ignore */
- break;
- case 1: // Brand id = 1: Intel Celeron (0.18 micron) processor
- strcpy(CPUInfo.strBrandID, "0.18 micron Intel Celeron"); /* Flawfinder: ignore */
- break;
- case 2: // Brand id = 2: Intel Pentium III (0.18 micron) processor
- strcpy(CPUInfo.strBrandID, "0.18 micron Intel Pentium III"); /* Flawfinder: ignore */
- break;
- case 3: // Brand id = 3: Model dependent
- if (CPUInfo.uiModel == 6) // If the cpu model is Celeron (well, I'm NOT SURE!!!)
- strcpy(CPUInfo.strBrandID, "0.13 micron Intel Celeron"); /* Flawfinder: ignore */
- else
- strcpy(CPUInfo.strBrandID, "0.18 micron Intel Pentium III Xeon"); /* Flawfinder: ignore */
- break;
- case 4: // Brand id = 4: Intel Pentium III Tualatin (0.13 micron) processor
- strcpy(CPUInfo.strBrandID, "0.13 micron Intel Pentium III"); /* Flawfinder: ignore */
- break;
- case 6: // Brand id = 6: Intel Pentium III mobile (0.13 micron) processor
- strcpy(CPUInfo.strBrandID, "0.13 micron Intel Pentium III mobile"); /* Flawfinder: ignore */
- break;
- case 7: // Brand id = 7: Intel Celeron mobile (0.13 micron) processor
- strcpy(CPUInfo.strBrandID, "0.13 micron Intel Celeron mobile"); /* Flawfinder: ignore */
- break;
- case 8: // Brand id = 8: Intel Pentium 4 Willamette (0.18 micron) processor
- strcpy(CPUInfo.strBrandID, "0.18 micron Intel Pentium 4"); /* Flawfinder: ignore */
- break;
- case 9: // Brand id = 9: Intel Pentium 4 Northwood (0.13 micron) processor
- strcpy(CPUInfo.strBrandID, "0.13 micron Intel Pentium 4"); /* Flawfinder: ignore */
- break;
- case 0xA: // Brand id = 0xA: Intel Pentium 4 Northwood (0.13 micron processor)
- strcpy(CPUInfo.strBrandID, "0.13 micron Intel Pentium 4"); /* Flawfinder: ignore */
- break; // No idea, where the difference to id=9 is
- case 0xB: // Brand id = 0xB: Intel Pentium 4 Northwood Xeon (0.13 micron processor)
- strcpy(CPUInfo.strBrandID, "0.13 micron Intel Pentium 4 Xeon"); /* Flawfinder: ignore */
- break;
- case 0xE: // Brand id = 0xE: Intel Pentium 4 Willamette Xeon (0.18 micron processor)
- strcpy(CPUInfo.strBrandID, "0.18 micron Intel Pentium 4 Xeon"); /* Flawfinder: ignore */
- break;
- default: // Should be never called, but sure is sure
- strcpy(CPUInfo.strBrandID, "Unknown"); /* Flawfinder: ignore */
- break;
+ strcpy(CPUInfo.strBrandID, INTEL_BRAND[CPUInfo.uiBrandID]);
+
+ if (CPUInfo.uiBrandID == 3 && CPUInfo.uiModel == 6)
+ {
+ strcpy(CPUInfo.strBrandID, "0.18 micron Intel Pentium III Xeon");
+ }
}
// Then we translate the cpu family
@@ -648,33 +616,6 @@ bool CProcessor::AnalyzeAMDProcessor()
CPUInfo.uiFamily = (eaxreg >> 8) & 0xF;
CPUInfo.uiType = (eaxreg >> 12) & 0x3;
- // After that, we translate the processor type (see CProcessor::AnalyzeIntelProcessor()
- // for further comments on this)
- switch (CPUInfo.uiType)
- {
- case 0:
- strcpy(CPUInfo.strType, "Original OEM"); /* Flawfinder: ignore */
- strcpy(strCPUName, CPUInfo.strType); /* Flawfinder: ignore */
- strcat(strCPUName, " "); /*Flawfinder: ignore*/
- break;
- case 1:
- strcpy(CPUInfo.strType, "Overdrive"); /* Flawfinder: ignore */
- strcpy(strCPUName, CPUInfo.strType); /* Flawfinder: ignore */
- strcat(strCPUName, " "); /*Flawfinder: ignore*/
- break;
- case 2:
- strcpy(CPUInfo.strType, "Dual-capable"); /* Flawfinder: ignore */
- strcpy(strCPUName, CPUInfo.strType); /* Flawfinder: ignore */
- strcat(strCPUName, " "); /*Flawfinder: ignore*/
- break;
- case 3:
- strcpy(CPUInfo.strType, "Reserved"); /* Flawfinder: ignore */
- break;
- default:
- strcpy(CPUInfo.strType, "Unknown"); /* Flawfinder: ignore */
- break;
- }
-
// Now we check if the processor supports the brand id string extended CPUID level
if (CPUInfo.MaxSupportedExtendedLevel >= 0x80000004)
{
@@ -709,7 +650,7 @@ bool CProcessor::AnalyzeAMDProcessor()
else
{
// Or just tell there is no brand id string support
- strcpy(CPUInfo.strBrandID, "Not supported"); /* Flawfinder: ignore */
+ strcpy(CPUInfo.strBrandID, ""); /* Flawfinder: ignore */
}
// After that we translate the processor family
@@ -1103,26 +1044,6 @@ bool CProcessor::AnalyzeUnknownProcessor()
snprintf(CPUInfo.strFamily, sizeof(CPUInfo.strFamily), "Family number %d", CPUInfo.uiFamily); /* Flawfinder: ignore */
snprintf(CPUInfo.strModel, sizeof(CPUInfo.strModel), "Model number %d", CPUInfo.uiModel); /* Flawfinder: ignore */
- // Nevertheless we can determine the processor type
- switch (CPUInfo.uiType)
- {
- case 0:
- strcpy(CPUInfo.strType, "Original OEM"); /*Flawfinder: ignore*/
- break;
- case 1:
- strcpy(CPUInfo.strType, "Overdrive"); /*Flawfinder: ignore*/
- break;
- case 2:
- strcpy(CPUInfo.strType, "Dual-capable"); /*Flawfinder: ignore*/
- break;
- case 3:
- strcpy(CPUInfo.strType, "Reserved"); /*Flawfinder: ignore*/
- break;
- default:
- strcpy(CPUInfo.strType, "Unknown"); /*Flawfinder: ignore*/
- break;
- }
-
// And thats it
return true;
#else
@@ -1634,6 +1555,8 @@ const ProcessorInfo *CProcessor::GetCPUInfo()
*((unsigned long *) CPUInfo.strVendor) = ebxreg;
*((unsigned long *) (CPUInfo.strVendor+4)) = edxreg;
*((unsigned long *) (CPUInfo.strVendor+8)) = ecxreg;
+ // Null terminate for string comparisons below.
+ CPUInfo.strVendor[12] = 0;
// We can also read the max. supported standard CPUID level
CPUInfo.MaxSupportedLevel = eaxreg & 0xFFFF;
@@ -1649,22 +1572,52 @@ const ProcessorInfo *CProcessor::GetCPUInfo()
CPUInfo.MaxSupportedExtendedLevel = eaxreg;
// Then we switch to the specific processor vendors
- switch (ebxreg)
+ // See http://www.sandpile.org/ia32/cpuid.htm
+ if (!strcmp(CPUInfo.strVendor, "GenuineIntel"))
{
- case 0x756E6547: // GenuineIntel
- AnalyzeIntelProcessor();
- break;
- case 0x68747541: // AuthenticAMD
- AnalyzeAMDProcessor();
- break;
- case 0x69727943: // CyrixInstead
- // I really do not know anyone owning such a piece of crab
- // So we analyze it as an unknown processor *ggggg*
- default:
- AnalyzeUnknownProcessor();
- break;
+ AnalyzeIntelProcessor();
+ }
+ else if (!strcmp(CPUInfo.strVendor, "AuthenticAMD"))
+ {
+ AnalyzeAMDProcessor();
+ }
+ else if (!strcmp(CPUInfo.strVendor, "UMC UMC UMC"))
+ {
+ AnalyzeUnknownProcessor();
+ }
+ else if (!strcmp(CPUInfo.strVendor, "CyrixInstead"))
+ {
+ AnalyzeUnknownProcessor();
+ }
+ else if (!strcmp(CPUInfo.strVendor, "NexGenDriven"))
+ {
+ AnalyzeUnknownProcessor();
+ }
+ else if (!strcmp(CPUInfo.strVendor, "CentaurHauls"))
+ {
+ AnalyzeUnknownProcessor();
+ }
+ else if (!strcmp(CPUInfo.strVendor, "RiseRiseRise"))
+ {
+ AnalyzeUnknownProcessor();
+ }
+ else if (!strcmp(CPUInfo.strVendor, "SiS SiS SiS"))
+ {
+ AnalyzeUnknownProcessor();
+ }
+ else if (!strcmp(CPUInfo.strVendor, "GenuineTMx86"))
+ {
+ // Transmeta
+ AnalyzeUnknownProcessor();
+ }
+ else if (!strcmp(CPUInfo.strVendor, "Geode by NSC"))
+ {
+ AnalyzeUnknownProcessor();
+ }
+ else
+ {
+ AnalyzeUnknownProcessor();
}
-
#endif
// After all we return the class CPUInfo member var
return (&CPUInfo);
@@ -1748,6 +1701,7 @@ void CProcessor::TranslateProcessorConfiguration()
CProcessor::CProcessor()
{
uqwFrequency = 0;
+ strCPUName[0] = 0;
memset(&CPUInfo, 0, sizeof(CPUInfo));
}
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 54276f9f2f..6f0bda4b71 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -12,6 +12,7 @@
#include <iostream>
#include <zlib/zlib.h>
+
#include "processor.h"
#if LL_WINDOWS
@@ -289,50 +290,28 @@ LLCPUInfo::LLCPUInfo()
mFamily.assign( info->strFamily );
}
+
std::string LLCPUInfo::getCPUString() const
{
- std::string cpu_string;
-
#if LL_WINDOWS || LL_DARWIN
- // gather machine information.
- char proc_buf[CPUINFO_BUFFER_SIZE]; /* Flawfinder: ignore */
- CProcessor proc;
- if(proc.CPUInfoToText(proc_buf, CPUINFO_BUFFER_SIZE))
- {
- cpu_string.append(proc_buf);
- }
-#else
- cpu_string.append("Can't get CPU information");
-#endif
-
- return cpu_string;
-}
-
-std::string LLCPUInfo::getCPUStringTerse() const
-{
- std::string cpu_string;
+ std::ostringstream out;
-#if LL_WINDOWS || LL_DARWIN
CProcessor proc;
- const ProcessorInfo *info = proc.GetCPUInfo();
-
- cpu_string.append(info->strBrandID);
+ (void) proc.GetCPUInfo();
+ out << proc.strCPUName << " ";
- F64 freq = (F64)(S64)proc.GetCPUFrequency(50) / 1000000.f;
+ F32 freq = (F32)(proc.GetCPUFrequency(50) / 1000000.0);
// cpu speed is often way wrong, do a sanity check
- if (freq < 10000.f && freq > 200.f )
+ if (200.f < freq && freq < 10000.f)
{
- char tmp[MAX_STRING]; /* Flawfinder: ignore */
- snprintf(tmp, sizeof(tmp), " (%.0f Mhz)", freq); /* Flawfinder: ignore */
-
- cpu_string.append(tmp);
+ out << "(" << (S32)(freq) << " MHz)";
}
+
+ return out.str();
#else
- cpu_string.append("Can't get terse CPU information");
+ return "Can't get terse CPU information";
#endif
-
- return cpu_string;
}
void LLCPUInfo::stream(std::ostream& s) const
diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h
index 05c975a5fa..7808a97b80 100644
--- a/indra/llcommon/llsys.h
+++ b/indra/llcommon/llsys.h
@@ -51,7 +51,6 @@ public:
void stream(std::ostream& s) const;
std::string getCPUString() const;
- std::string getCPUStringTerse() const;
BOOL hasSSE() const { return mHasSSE; }
BOOL hasSSE2() const { return mHasSSE2; }
diff --git a/indra/llmath/m4math.cpp b/indra/llmath/m4math.cpp
index 969c3663e6..8d5fc27776 100644
--- a/indra/llmath/m4math.cpp
+++ b/indra/llmath/m4math.cpp
@@ -654,31 +654,55 @@ LLVector4 operator*(const LLMatrix4 &a, const LLVector4 &b)
}
*/
+// Operates "to the left" on row-vector a
+//
+// This used to be in the header file but was not actually inlined in practice.
+// When avatar vertex programs are off, this function is a hot spot in profiles
+// due to software skinning in LLViewerJointMesh::updateGeometry(). JC
+LLVector3 operator*(const LLVector3 &a, const LLMatrix4 &b)
+{
+ // This is better than making a temporary LLVector3. This eliminates an
+ // unnecessary LLVector3() constructor and also helps the compiler to
+ // realize that the output floats do not alias the input floats, hence
+ // eliminating redundant loads of a.mV[0], etc. JC
+ return LLVector3(a.mV[VX] * b.mMatrix[VX][VX] +
+ a.mV[VY] * b.mMatrix[VY][VX] +
+ a.mV[VZ] * b.mMatrix[VZ][VX] +
+ b.mMatrix[VW][VX],
+
+ a.mV[VX] * b.mMatrix[VX][VY] +
+ a.mV[VY] * b.mMatrix[VY][VY] +
+ a.mV[VZ] * b.mMatrix[VZ][VY] +
+ b.mMatrix[VW][VY],
+
+ a.mV[VX] * b.mMatrix[VX][VZ] +
+ a.mV[VY] * b.mMatrix[VY][VZ] +
+ a.mV[VZ] * b.mMatrix[VZ][VZ] +
+ b.mMatrix[VW][VZ]);
+}
LLVector4 operator*(const LLVector4 &a, const LLMatrix4 &b)
{
// Operate "to the left" on row-vector a
- LLVector4 vec;
- vec.mV[VX] = a.mV[VX] * b.mMatrix[VX][VX] +
- a.mV[VY] * b.mMatrix[VY][VX] +
- a.mV[VZ] * b.mMatrix[VZ][VX] +
- a.mV[VW] * b.mMatrix[VW][VX];
-
- vec.mV[VY] = a.mV[VX] * b.mMatrix[VX][VY] +
- a.mV[VY] * b.mMatrix[VY][VY] +
- a.mV[VZ] * b.mMatrix[VZ][VY] +
- a.mV[VW] * b.mMatrix[VW][VY];
-
- vec.mV[VZ] = a.mV[VX] * b.mMatrix[VX][VZ] +
- a.mV[VY] * b.mMatrix[VY][VZ] +
- a.mV[VZ] * b.mMatrix[VZ][VZ] +
- a.mV[VW] * b.mMatrix[VW][VZ];
-
- vec.mV[VW] = a.mV[VX] * b.mMatrix[VX][VW] +
- a.mV[VY] * b.mMatrix[VY][VW] +
- a.mV[VZ] * b.mMatrix[VZ][VW] +
- a.mV[VW] * b.mMatrix[VW][VW];
- return vec;
+ return LLVector4(a.mV[VX] * b.mMatrix[VX][VX] +
+ a.mV[VY] * b.mMatrix[VY][VX] +
+ a.mV[VZ] * b.mMatrix[VZ][VX] +
+ a.mV[VW] * b.mMatrix[VW][VX],
+
+ a.mV[VX] * b.mMatrix[VX][VY] +
+ a.mV[VY] * b.mMatrix[VY][VY] +
+ a.mV[VZ] * b.mMatrix[VZ][VY] +
+ a.mV[VW] * b.mMatrix[VW][VY],
+
+ a.mV[VX] * b.mMatrix[VX][VZ] +
+ a.mV[VY] * b.mMatrix[VY][VZ] +
+ a.mV[VZ] * b.mMatrix[VZ][VZ] +
+ a.mV[VW] * b.mMatrix[VW][VZ],
+
+ a.mV[VX] * b.mMatrix[VX][VW] +
+ a.mV[VY] * b.mMatrix[VY][VW] +
+ a.mV[VZ] * b.mMatrix[VZ][VW] +
+ a.mV[VW] * b.mMatrix[VW][VW]);
}
LLVector4 rotate_vector(const LLVector4 &a, const LLMatrix4 &b)
diff --git a/indra/llmath/m4math.h b/indra/llmath/m4math.h
index 69463d7718..e95a40af16 100644
--- a/indra/llmath/m4math.h
+++ b/indra/llmath/m4math.h
@@ -247,27 +247,6 @@ inline const LLMatrix4& LLMatrix4::identity()
return (*this);
}
-inline LLVector3 operator*(const LLVector3 &a, const LLMatrix4 &b)
-{
- // Converts a to LLVector4 and applies full transformation
- // Operates "to the left" on row-vector a
- LLVector3 vec;
- vec.mV[VX] = a.mV[VX] * b.mMatrix[VX][VX] +
- a.mV[VY] * b.mMatrix[VY][VX] +
- a.mV[VZ] * b.mMatrix[VZ][VX] +
- b.mMatrix[VW][VX];
-
- vec.mV[VY] = a.mV[VX] * b.mMatrix[VX][VY] +
- a.mV[VY] * b.mMatrix[VY][VY] +
- a.mV[VZ] * b.mMatrix[VZ][VY] +
- b.mMatrix[VW][VY];
-
- vec.mV[VZ] = a.mV[VX] * b.mMatrix[VX][VZ] +
- a.mV[VY] * b.mMatrix[VY][VZ] +
- a.mV[VZ] * b.mMatrix[VZ][VZ] +
- b.mMatrix[VW][VZ];
- return vec;
-}
/*
inline LLMatrix4 operator*(const LLMatrix4 &a, const LLMatrix4 &b)
diff --git a/indra/llmath/v4math.h b/indra/llmath/v4math.h
index e9b8d5b71f..ced7ef131a 100644
--- a/indra/llmath/v4math.h
+++ b/indra/llmath/v4math.h
@@ -26,7 +26,8 @@ class LLVector4
public:
F32 mV[LENGTHOFVECTOR4];
LLVector4(); // Initializes LLVector4 to (0, 0, 0, 1)
- explicit LLVector4(const F32 *vec); // Initializes LLVector4 to (vec[0]. vec[1], vec[2], 1)
+ explicit LLVector4(const F32 *vec); // Initializes LLVector4 to (vec[0]. vec[1], vec[2], vec[3])
+ explicit LLVector4(const F64 *vec); // Initialized LLVector4 to ((F32) vec[0], (F32) vec[1], (F32) vec[3], (F32) vec[4]);
explicit LLVector4(const LLVector3 &vec); // Initializes LLVector4 to (vec, 1)
explicit LLVector4(const LLVector3 &vec, F32 w); // Initializes LLVector4 to (vec, w)
LLVector4(F32 x, F32 y, F32 z); // Initializes LLVector4 to (x. y, z, 1)
@@ -136,6 +137,14 @@ inline LLVector4::LLVector4(const F32 *vec)
mV[VW] = vec[VW];
}
+inline LLVector4::LLVector4(const F64 *vec)
+{
+ mV[VX] = (F32) vec[VX];
+ mV[VY] = (F32) vec[VY];
+ mV[VZ] = (F32) vec[VZ];
+ mV[VW] = (F32) vec[VW];
+}
+
inline LLVector4::LLVector4(const LLVector3 &vec)
{
mV[VX] = vec.mV[VX];
diff --git a/indra/llmessage/llclassifiedflags.h b/indra/llmessage/llclassifiedflags.h
index 1949eb54d0..610ad35c4a 100644
--- a/indra/llmessage/llclassifiedflags.h
+++ b/indra/llmessage/llclassifiedflags.h
@@ -22,6 +22,8 @@ const U8 CLASSIFIED_QUERY_FILTER_MATURE = 1 << 1;
const U8 CLASSIFIED_QUERY_FILTER_ENABLED = 1 << 2;
const U8 CLASSIFIED_QUERY_FILTER_PRICE = 1 << 3;
+const S32 MAX_CLASSIFIEDS = 100;
+
ClassifiedFlags pack_classified_flags(BOOL is_mature, BOOL auto_renew);
bool is_cf_mature(ClassifiedFlags flags);
//bool is_cf_enabled(ClassifiedFlags flags);
diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp
index 099b6a0a5b..6fb319326b 100644
--- a/indra/llmessage/message.cpp
+++ b/indra/llmessage/message.cpp
@@ -33,6 +33,7 @@
// linden library headers
#include "indra_constants.h"
+#include "lldarray.h"
#include "lldir.h"
#include "llerror.h"
#include "llfasttimer.h"
@@ -447,7 +448,6 @@ private:
};
-
// static
BOOL LLMessageSystem::mTimeDecodes = FALSE;
@@ -827,6 +827,9 @@ void LLMessageSystem::init()
mMessageFileChecksum = 0;
mMessageFileVersionNumber = 0.f;
+
+ mTimingCallback = NULL;
+ mTimingCallbackData = NULL;
}
LLMessageSystem::LLMessageSystem()
@@ -3480,7 +3483,7 @@ BOOL LLMessageSystem::decodeData(const U8* buffer, const LLHost& sender )
{
static LLTimer decode_timer;
- if( mTimeDecodes )
+ if( mTimeDecodes || mTimingCallback )
{
decode_timer.reset();
}
@@ -3503,25 +3506,36 @@ BOOL LLMessageSystem::decodeData(const U8* buffer, const LLHost& sender )
// VTPause(); // VTune
// }
- if( mTimeDecodes )
+ if( mTimeDecodes || mTimingCallback )
{
F32 decode_time = decode_timer.getElapsedTimeF32();
- mCurrentRMessageTemplate->mDecodeTimeThisFrame += decode_time;
-
- mCurrentRMessageTemplate->mTotalDecoded++;
- mCurrentRMessageTemplate->mTotalDecodeTime += decode_time;
- if( mCurrentRMessageTemplate->mMaxDecodeTimePerMsg < decode_time )
+ if (mTimingCallback)
{
- mCurrentRMessageTemplate->mMaxDecodeTimePerMsg = decode_time;
+ mTimingCallback(mCurrentRMessageTemplate->mName,
+ decode_time,
+ mTimingCallbackData);
}
-
- if( decode_time > mTimeDecodesSpamThreshold )
+ if (mTimeDecodes)
{
- lldebugs << "--------- Message " << mCurrentRMessageTemplate->mName << " decode took " << decode_time << " seconds. (" <<
- mCurrentRMessageTemplate->mMaxDecodeTimePerMsg << " max, " <<
- (mCurrentRMessageTemplate->mTotalDecodeTime / mCurrentRMessageTemplate->mTotalDecoded) << " avg)" << llendl;
+ mCurrentRMessageTemplate->mDecodeTimeThisFrame += decode_time;
+
+ mCurrentRMessageTemplate->mTotalDecoded++;
+ mCurrentRMessageTemplate->mTotalDecodeTime += decode_time;
+
+ if( mCurrentRMessageTemplate->mMaxDecodeTimePerMsg < decode_time )
+ {
+ mCurrentRMessageTemplate->mMaxDecodeTimePerMsg = decode_time;
+ }
+
+
+ if( decode_time > mTimeDecodesSpamThreshold )
+ {
+ lldebugs << "--------- Message " << mCurrentRMessageTemplate->mName << " decode took " << decode_time << " seconds. (" <<
+ mCurrentRMessageTemplate->mMaxDecodeTimePerMsg << " max, " <<
+ (mCurrentRMessageTemplate->mTotalDecodeTime / mCurrentRMessageTemplate->mTotalDecoded) << " avg)" << llendl;
+ }
}
}
}
@@ -4516,76 +4530,6 @@ void process_deny_trusted_circuit(LLMessageSystem *msg, void **)
msg->sendCreateTrustedCircuit(msg->getSender(), local_id, remote_id);
}
-#define LL_ENCRYPT_BUF_LENGTH 16384
-
-void encrypt_template(const char *src_name, const char *dest_name)
-{
- // encrypt and decrypt are symmetric
- decrypt_template(src_name, dest_name);
-}
-
-BOOL decrypt_template(const char *src_name, const char *dest_name)
-{
- S32 buf_length = LL_ENCRYPT_BUF_LENGTH;
- char buf[LL_ENCRYPT_BUF_LENGTH]; /* Flawfinder: ignore */
-
- FILE* infp = NULL;
- FILE* outfp = NULL;
- BOOL success = FALSE;
- char* bufp = NULL;
- U32 key = 0;
- S32 more_data = 0;
-
- if(src_name==NULL)
- {
- llwarns << "Input src_name is NULL!!" << llendl;
- goto exit;
- }
-
- infp = LLFile::fopen(src_name,"rb"); /* Flawfinder: ignore */
- if (!infp)
- {
- llwarns << "could not open " << src_name << " for reading" << llendl;
- goto exit;
- }
-
- if(dest_name==NULL)
- {
- llwarns << "Output dest_name is NULL!!" << llendl;
- goto exit;
- }
-
- outfp = LLFile::fopen(dest_name,"w+b"); /* Flawfinder: ignore */
- if (!outfp)
- {
- llwarns << "could not open " << src_name << " for writing" << llendl;
- goto exit;
- }
-
- while ((buf_length = (S32)fread(buf,1,LL_ENCRYPT_BUF_LENGTH,infp)))
- {
- // unscrozzle bits here
- bufp = buf;
- more_data = buf_length;
- while (more_data--)
- {
- *bufp = *bufp ^ ((key * 43) % 256);
- key++;
- bufp++;
- }
-
- if(buf_length != (S32)fwrite(buf,1,buf_length,outfp))
- {
- goto exit;
- }
- }
- success = TRUE;
-
- exit:
- if(infp) fclose(infp);
- if(outfp) fclose(outfp);
- return success;
-}
void dump_prehash_files()
{
@@ -5278,6 +5222,12 @@ BOOL LLMessageSystem::callExceptionFunc(EMessageException exception)
return FALSE;
}
+void LLMessageSystem::setTimingFunc(msg_timing_callback func, void* data)
+{
+ mTimingCallback = func;
+ mTimingCallbackData = data;
+}
+
BOOL LLMessageSystem::isCircuitCodeKnown(U32 code) const
{
if(mCircuitCodes.find(code) == mCircuitCodes.end())
diff --git a/indra/llmessage/message.h b/indra/llmessage/message.h
index 3f9dfa08d6..3ffafcc1b8 100644
--- a/indra/llmessage/message.h
+++ b/indra/llmessage/message.h
@@ -26,16 +26,13 @@
#include "llerror.h"
#include "net.h"
#include "string_table.h"
-#include "llptrskipmap.h"
#include "llcircuit.h"
#include "lltimer.h"
#include "llpacketring.h"
#include "llhost.h"
#include "llpacketack.h"
-#include "doublelinkedlist.h"
#include "message_prehash.h"
#include "llstl.h"
-#include "lldarray.h"
const U32 MESSAGE_MAX_STRINGS_LENGTH = 64;
const U32 MESSAGE_NUMBER_OF_HASH_BUCKETS = 8192;
@@ -178,7 +175,6 @@ enum EMessageException
typedef void (*msg_exception_callback)(LLMessageSystem*,void*,EMessageException);
-
class LLMsgData;
class LLMsgBlkData;
class LLMessageTemplate;
@@ -307,6 +303,12 @@ public:
// function was found and called. Otherwise return FALSE.
BOOL callExceptionFunc(EMessageException exception);
+ // Set a function that will be called once per packet processed with the
+ // hashed message name and the time spent in the processing handler function
+ // measured in seconds. JC
+ typedef void (*msg_timing_callback)(const char* hashed_name, F32 time, void* data);
+ void setTimingFunc(msg_timing_callback func, void* data = NULL);
+
// This method returns true if the code is in the circuit codes map.
BOOL isCircuitCodeKnown(U32 code) const;
@@ -734,16 +736,15 @@ private:
static F32 mTimeDecodesSpamThreshold; // If mTimeDecodes is on, all this many seconds for each msg decode before spamming
static BOOL mTimeDecodes; // Measure time for all message decodes if TRUE;
+ msg_timing_callback mTimingCallback;
+ void* mTimingCallbackData;
+
void init(); // ctor shared initialisation.
};
// external hook into messaging system
extern LLMessageSystem *gMessageSystem;
-//extern const char* MESSAGE_LOG_FILENAME;
-
-void encrypt_template(const char *src_name, const char *dest_name);
-BOOL decrypt_template(const char *src_name, const char *dest_name);
// Must specific overall system version, which is used to determine
// if a patch is available in the message template checksum verification.
@@ -1232,22 +1233,9 @@ inline void LLMessageSystem::getString(const char *block, const char *var, S32 b
s[buffer_size - 1] = '\0';
}
-//-----------------------------------------------------------------------------
-// Transmission aliases
-//-----------------------------------------------------------------------------
-//inline S32 LLMessageSystem::sendMessage(U32 ip, U32 port, BOOL zero_code)
-//{
-// return sendMessage(LLHost(ip, port), zero_code);
-//}
-
-//inline S32 LLMessageSystem::sendMessage(const char *ip_str, U32 port, BOOL zero_code)
-//{
-// return sendMessage(LLHost(ip_str, port), zero_code);
-//}
-
-inline S32 LLMessageSystem::sendMessage(const U32 circuit)//, BOOL zero_code)
+inline S32 LLMessageSystem::sendMessage(const U32 circuit)
{
- return sendMessage(findHost(circuit));//, zero_code);
+ return sendMessage(findHost(circuit));
}
#endif
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index 1196db18fa..a36dfd2269 100644
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -157,7 +157,7 @@ void LLImageGL::destroyGL(BOOL save_state)
if (save_state)
{
glimage->mSaveData = new LLImageRaw;
- glimage->readBackRaw(glimage->mCurrentDiscardLevel, glimage->mSaveData);
+ glimage->readBackRaw(glimage->mCurrentDiscardLevel, glimage->mSaveData, false);
}
glimage->destroyGLTexture();
stop_glerror();
@@ -920,7 +920,7 @@ BOOL LLImageGL::setDiscardLevel(S32 discard_level)
LLPointer<LLImageRaw> imageraw = new LLImageRaw;
while(discard_level > mCurrentDiscardLevel)
{
- if (readBackRaw(discard_level, imageraw))
+ if (readBackRaw(discard_level, imageraw, false))
{
break;
}
@@ -942,7 +942,7 @@ BOOL LLImageGL::setDiscardLevel(S32 discard_level)
}
}
-BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw)
+BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compressed_ok)
{
if (discard_level < 0)
{
@@ -980,7 +980,10 @@ BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw)
}
LLGLint is_compressed = 0;
- glGetTexLevelParameteriv(mTarget, is_compressed, GL_TEXTURE_COMPRESSED, (GLint*)&is_compressed);
+ if (compressed_ok)
+ {
+ glGetTexLevelParameteriv(mTarget, is_compressed, GL_TEXTURE_COMPRESSED, (GLint*)&is_compressed);
+ }
if (is_compressed)
{
LLGLint glbytes;
diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h
index 1586a837b4..d66c286184 100644
--- a/indra/llrender/llimagegl.h
+++ b/indra/llrender/llimagegl.h
@@ -72,7 +72,8 @@ public:
BOOL setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height);
BOOL setSubImageFromFrameBuffer(S32 fb_x, S32 fb_y, S32 x_pos, S32 y_pos, S32 width, S32 height);
BOOL setDiscardLevel(S32 discard_level);
- BOOL readBackRaw(S32 discard_level, LLImageRaw* imageraw); // Read back a raw image for this discard level, if it exists
+ // Read back a raw image for this discard level, if it exists
+ BOOL readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compressed_ok);
void destroyGLTexture();
void setClamp(BOOL clamps, BOOL clampt);
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 8e81fec33b..9f66daf890 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -933,6 +933,19 @@ LLXMLNodePtr LLButton::getXML(bool save_children) const
return node;
}
+void clicked_help(void* data)
+{
+ LLButton* self = (LLButton*)data;
+ if (!self) return;
+
+ if (!LLUI::sHtmlHelp)
+ {
+ return;
+ }
+
+ LLUI::sHtmlHelp->show(self->getHelpURL());
+}
+
// static
LLView* LLButton::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory)
{
@@ -1009,9 +1022,21 @@ LLView* LLButton::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *fa
{
button->setLabelSelected(node->getTextContents());
}
+
+ if (node->hasAttribute("help_url"))
+ {
+ LLString help_url;
+ node->getAttributeString("help_url",help_url);
+ button->setHelpURLCallback(help_url);
+ }
button->initFromXML(node, parent);
return button;
}
+void LLButton::setHelpURLCallback(std::string help_url)
+{
+ mHelpURL = help_url;
+ setClickedCallback(clicked_help,this);
+}
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 3dea4434a9..9048358bd8 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -163,6 +163,8 @@ public:
void setCommitOnReturn(BOOL commit) { mCommitOnReturn = commit; }
BOOL getCommitOnReturn() { return mCommitOnReturn; }
+ void setHelpURLCallback(std::string help_url);
+ LLString getHelpURL() { return mHelpURL; }
protected:
virtual void drawBorder(const LLColor4& color, S32 size);
@@ -243,6 +245,8 @@ protected:
BOOL mNeedsHighlight;
BOOL mCommitOnReturn;
+ LLString mHelpURL;
+
LLPointer<LLImageGL> mImagep;
static LLFrameTimer sFlashingTimer;
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index c412d77922..a3353d2028 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -457,6 +457,24 @@ void LLTabContainerCommon::onPrevBtn( void* userdata )
self->mScrolled = FALSE;
}
+
+void LLTabContainerCommon::onJumpFirstBtn( void* userdata )
+{
+ LLTabContainer* self = (LLTabContainer*) userdata;
+
+ self->mScrollPos = 0;
+
+}
+
+
+void LLTabContainerCommon::onJumpLastBtn( void* userdata )
+{
+ LLTabContainer* self = (LLTabContainer*) userdata;
+
+ self->mScrollPos = self->mMaxScrollPos;
+}
+
+
// static
void LLTabContainerCommon::onPrevBtnHeld( void* userdata )
{
@@ -673,6 +691,8 @@ LLTabContainer::LLTabContainer(
LLTabContainerCommon(name, rect, pos, close_callback, callback_userdata, bordered),
mLeftArrowBtn(NULL),
mRightArrowBtn(NULL),
+ mJumpLeftArrowBtn(NULL),
+ mJumpRightArrowBtn(NULL),
mRightTabBtnOffset(0),
mMinTabWidth(TABCNTR_TAB_MIN_WIDTH),
mMaxTabWidth(TABCNTR_TAB_MAX_WIDTH),
@@ -689,6 +709,8 @@ LLTabContainer::LLTabContainer(
LLTabContainerCommon(name, rect_control, pos, close_callback, callback_userdata, bordered),
mLeftArrowBtn(NULL),
mRightArrowBtn(NULL),
+ mJumpLeftArrowBtn(NULL),
+ mJumpRightArrowBtn(NULL),
mRightTabBtnOffset(0),
mMinTabWidth(TABCNTR_TAB_MIN_WIDTH),
mMaxTabWidth(TABCNTR_TAB_MAX_WIDTH),
@@ -720,14 +742,35 @@ void LLTabContainer::initButtons()
S32 btn_top = (mTabPosition == TOP ) ? mRect.getHeight() - mTopBorderHeight : TABCNTR_ARROW_BTN_SIZE + 1;
LLRect left_arrow_btn_rect;
- left_arrow_btn_rect.setLeftTopAndSize( LLPANEL_BORDER_WIDTH+1, btn_top + arrow_fudge, TABCNTR_ARROW_BTN_SIZE, TABCNTR_ARROW_BTN_SIZE );
+ left_arrow_btn_rect.setLeftTopAndSize( LLPANEL_BORDER_WIDTH+1+TABCNTR_ARROW_BTN_SIZE, btn_top + arrow_fudge, TABCNTR_ARROW_BTN_SIZE, TABCNTR_ARROW_BTN_SIZE );
+
+ LLRect jump_left_arrow_btn_rect;
+ jump_left_arrow_btn_rect.setLeftTopAndSize( LLPANEL_BORDER_WIDTH+1, btn_top + arrow_fudge, TABCNTR_ARROW_BTN_SIZE, TABCNTR_ARROW_BTN_SIZE );
S32 right_pad = TABCNTR_ARROW_BTN_SIZE + LLPANEL_BORDER_WIDTH + 1;
+
LLRect right_arrow_btn_rect;
- right_arrow_btn_rect.setLeftTopAndSize( mRect.getWidth() - mRightTabBtnOffset - right_pad,
+ right_arrow_btn_rect.setLeftTopAndSize( mRect.getWidth() - mRightTabBtnOffset - right_pad - TABCNTR_ARROW_BTN_SIZE,
btn_top + arrow_fudge,
TABCNTR_ARROW_BTN_SIZE, TABCNTR_ARROW_BTN_SIZE );
+
+ LLRect jump_right_arrow_btn_rect;
+ jump_right_arrow_btn_rect.setLeftTopAndSize( mRect.getWidth() - mRightTabBtnOffset - right_pad,
+ btn_top + arrow_fudge,
+ TABCNTR_ARROW_BTN_SIZE, TABCNTR_ARROW_BTN_SIZE );
+
+ out_id = "UIImgBtnJumpLeftOutUUID";
+ in_id = "UIImgBtnJumpLeftInUUID";
+ mJumpLeftArrowBtn = new LLButton(
+ "Jump Left Arrow", jump_left_arrow_btn_rect,
+ out_id, in_id, "",
+ &LLTabContainer::onJumpFirstBtn, this, LLFontGL::sSansSerif );
+ mJumpLeftArrowBtn->setFollowsLeft();
+ mJumpLeftArrowBtn->setSaveToXML(false);
+ mJumpLeftArrowBtn->setTabStop(FALSE);
+ addChild(mJumpLeftArrowBtn);
+
out_id = "UIImgBtnScrollLeftOutUUID";
in_id = "UIImgBtnScrollLeftInUUID";
mLeftArrowBtn = new LLButton(
@@ -739,6 +782,18 @@ void LLTabContainer::initButtons()
mLeftArrowBtn->setSaveToXML(false);
mLeftArrowBtn->setTabStop(FALSE);
addChild(mLeftArrowBtn);
+
+ out_id = "UIImgBtnJumpRightOutUUID";
+ in_id = "UIImgBtnJumpRightInUUID";
+ mJumpRightArrowBtn = new LLButton(
+ "Jump Right Arrow", jump_right_arrow_btn_rect,
+ out_id, in_id, "",
+ &LLTabContainer::onJumpLastBtn, this,
+ LLFontGL::sSansSerif);
+ mJumpRightArrowBtn->setFollowsRight();
+ mJumpRightArrowBtn->setSaveToXML(false);
+ mJumpRightArrowBtn->setTabStop(FALSE);
+ addChild(mJumpRightArrowBtn);
out_id = "UIImgBtnScrollRightOutUUID";
in_id = "UIImgBtnScrollRightInUUID";
@@ -753,15 +808,20 @@ void LLTabContainer::initButtons()
mRightArrowBtn->setTabStop(FALSE);
addChild(mRightArrowBtn);
+
if( mTabPosition == TOP )
{
mRightArrowBtn->setFollowsTop();
mLeftArrowBtn->setFollowsTop();
+ mJumpLeftArrowBtn->setFollowsTop();
+ mJumpRightArrowBtn->setFollowsTop();
}
else
{
mRightArrowBtn->setFollowsBottom();
mLeftArrowBtn->setFollowsBottom();
+ mJumpLeftArrowBtn->setFollowsBottom();
+ mJumpRightArrowBtn->setFollowsBottom();
}
// set default tab group to be panel contents
@@ -952,7 +1012,7 @@ void LLTabContainer::updateMaxScrollPos()
if( tab_space > available_space )
{
- S32 available_width_with_arrows = mRect.getWidth() - mRightTabBtnOffset - 2 * (LLPANEL_BORDER_WIDTH + TABCNTR_ARROW_BTN_SIZE + 1);
+ S32 available_width_with_arrows = mRect.getWidth() - mRightTabBtnOffset - 2 * (LLPANEL_BORDER_WIDTH + TABCNTR_ARROW_BTN_SIZE + TABCNTR_ARROW_BTN_SIZE + 1);
// subtract off reserved portion on left
available_width_with_arrows -= TABCNTR_TAB_PARTIAL_WIDTH;
@@ -1059,7 +1119,7 @@ BOOL LLTabContainer::selectTab(S32 which)
}
else
{
- S32 available_width_with_arrows = mRect.getWidth() - mRightTabBtnOffset - 2 * (LLPANEL_BORDER_WIDTH + TABCNTR_ARROW_BTN_SIZE + 1);
+ S32 available_width_with_arrows = mRect.getWidth() - mRightTabBtnOffset - 2 * (LLPANEL_BORDER_WIDTH + TABCNTR_ARROW_BTN_SIZE + TABCNTR_ARROW_BTN_SIZE + 1);
S32 running_tab_width = tuple->mButton->getRect().getWidth();
S32 j = i - 1;
S32 min_scroll_pos = i;
@@ -1101,7 +1161,7 @@ void LLTabContainer::draw()
S32 cur_scroll_pos = mScrollPos;
if (cur_scroll_pos > 0)
{
- S32 available_width_with_arrows = mRect.getWidth() - mRightTabBtnOffset - 2 * (LLPANEL_BORDER_WIDTH + TABCNTR_ARROW_BTN_SIZE + 1);
+ S32 available_width_with_arrows = mRect.getWidth() - mRightTabBtnOffset - 2 * (LLPANEL_BORDER_WIDTH + TABCNTR_ARROW_BTN_SIZE + TABCNTR_ARROW_BTN_SIZE + 1);
for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)
{
if (cur_scroll_pos == 0)
@@ -1122,11 +1182,13 @@ void LLTabContainer::draw()
if( getVisible() )
{
BOOL has_scroll_arrows = (mMaxScrollPos > 0) || (mScrollPosPixels > 0);
+ mJumpLeftArrowBtn->setVisible( has_scroll_arrows );
+ mJumpRightArrowBtn->setVisible( has_scroll_arrows );
mLeftArrowBtn->setVisible( has_scroll_arrows );
mRightArrowBtn->setVisible( has_scroll_arrows );
// Set the leftmost position of the tab buttons.
- S32 left = LLPANEL_BORDER_WIDTH + (has_scroll_arrows ? TABCNTR_ARROW_BTN_SIZE : TABCNTR_TAB_H_PAD);
+ S32 left = LLPANEL_BORDER_WIDTH + (has_scroll_arrows ? (TABCNTR_ARROW_BTN_SIZE * 2) : TABCNTR_TAB_H_PAD);
left -= mScrollPosPixels;
// Hide all the buttons
@@ -1215,7 +1277,19 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask )
BOOL has_scroll_arrows = (mMaxScrollPos > 0);
if (has_scroll_arrows)
- {
+ {
+ if (mJumpLeftArrowBtn->getRect().pointInRect(x, y))
+ {
+ S32 local_x = x - mJumpLeftArrowBtn->getRect().mLeft;
+ S32 local_y = y - mJumpLeftArrowBtn->getRect().mBottom;
+ handled = mJumpLeftArrowBtn->handleMouseDown(local_x, local_y, mask);
+ }
+ if (mJumpRightArrowBtn->getRect().pointInRect(x, y))
+ {
+ S32 local_x = x - mJumpRightArrowBtn->getRect().mLeft;
+ S32 local_y = y - mJumpRightArrowBtn->getRect().mBottom;
+ handled = mJumpRightArrowBtn->handleMouseDown(local_x, local_y, mask);
+ }
if (mLeftArrowBtn->getRect().pointInRect(x, y))
{
S32 local_x = x - mLeftArrowBtn->getRect().mLeft;
@@ -1237,9 +1311,9 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask )
if (mTabList.size() > 0)
{
LLTabTuple* firsttuple = mTabList[0];
- LLRect tab_rect(has_scroll_arrows ? mLeftArrowBtn->getRect().mRight : mLeftArrowBtn->getRect().mLeft,
+ LLRect tab_rect(has_scroll_arrows ? mLeftArrowBtn->getRect().mRight : mJumpLeftArrowBtn->getRect().mLeft,
firsttuple->mButton->getRect().mTop,
- has_scroll_arrows ? mRightArrowBtn->getRect().mLeft : mRightArrowBtn->getRect().mRight,
+ has_scroll_arrows ? mRightArrowBtn->getRect().mLeft : mJumpRightArrowBtn->getRect().mRight,
firsttuple->mButton->getRect().mBottom );
if( tab_rect.pointInRect( x, y ) )
{
@@ -1257,7 +1331,19 @@ BOOL LLTabContainer::handleHover( S32 x, S32 y, MASK mask )
BOOL has_scroll_arrows = (mMaxScrollPos > 0);
if (has_scroll_arrows)
- {
+ {
+ if (mJumpLeftArrowBtn->getRect().pointInRect(x, y))
+ {
+ S32 local_x = x - mJumpLeftArrowBtn->getRect().mLeft;
+ S32 local_y = y - mJumpLeftArrowBtn->getRect().mBottom;
+ handled = mJumpLeftArrowBtn->handleHover(local_x, local_y, mask);
+ }
+ if (mJumpRightArrowBtn->getRect().pointInRect(x, y))
+ {
+ S32 local_x = x - mJumpRightArrowBtn->getRect().mLeft;
+ S32 local_y = y - mJumpRightArrowBtn->getRect().mBottom;
+ handled = mJumpRightArrowBtn->handleHover(local_x, local_y, mask);
+ }
if (mLeftArrowBtn->getRect().pointInRect(x, y))
{
S32 local_x = x - mLeftArrowBtn->getRect().mLeft;
@@ -1287,6 +1373,18 @@ BOOL LLTabContainer::handleMouseUp( S32 x, S32 y, MASK mask )
if (has_scroll_arrows)
{
+ if (mJumpLeftArrowBtn->getRect().pointInRect(x, y))
+ {
+ S32 local_x = x - mJumpLeftArrowBtn->getRect().mLeft;
+ S32 local_y = y - mJumpLeftArrowBtn->getRect().mBottom;
+ handled = mJumpLeftArrowBtn->handleMouseUp(local_x, local_y, mask);
+ }
+ if (mJumpRightArrowBtn->getRect().pointInRect(x, y))
+ {
+ S32 local_x = x - mJumpRightArrowBtn->getRect().mLeft;
+ S32 local_y = y - mJumpRightArrowBtn->getRect().mBottom;
+ handled = mJumpRightArrowBtn->handleMouseUp(local_x, local_y, mask);
+ }
if (mLeftArrowBtn->getRect().pointInRect(x, y))
{
S32 local_x = x - mLeftArrowBtn->getRect().mLeft;
@@ -1332,7 +1430,7 @@ BOOL LLTabContainer::handleToolTip( S32 x, S32 y, LLString& msg, LLRect* sticky_
BOOL has_scroll_arrows = (mMaxScrollPos > 0);
LLRect clip(
- has_scroll_arrows ? mLeftArrowBtn->getRect().mRight : mLeftArrowBtn->getRect().mLeft,
+ has_scroll_arrows ? mJumpLeftArrowBtn->getRect().mRight : mJumpLeftArrowBtn->getRect().mLeft,
firsttuple->mButton->getRect().mTop,
has_scroll_arrows ? mRightArrowBtn->getRect().mLeft : mRightArrowBtn->getRect().mRight,
0 );
@@ -1438,6 +1536,18 @@ BOOL LLTabContainer::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDrag
if (has_scroll_arrows)
{
+ if (mJumpLeftArrowBtn->getRect().pointInRect(x, y))
+ {
+ S32 local_x = x - mJumpLeftArrowBtn->getRect().mLeft;
+ S32 local_y = y - mJumpLeftArrowBtn->getRect().mBottom;
+ mJumpLeftArrowBtn->handleHover(local_x, local_y, mask);
+ }
+ if (mJumpRightArrowBtn->getRect().pointInRect(x, y))
+ {
+ S32 local_x = x - mJumpRightArrowBtn->getRect().mLeft;
+ S32 local_y = y - mJumpRightArrowBtn->getRect().mBottom;
+ mJumpRightArrowBtn->handleHover(local_x, local_y, mask);
+ }
if (mLeftArrowBtn->getRect().pointInRect(x, y))
{
S32 local_x = x - mLeftArrowBtn->getRect().mLeft;
diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h
index 41e602eaea..aa4c1c608a 100644
--- a/indra/llui/lltabcontainer.h
+++ b/indra/llui/lltabcontainer.h
@@ -109,6 +109,8 @@ public:
static void onNextBtnHeld(void* userdata);
static void onPrevBtn(void* userdata);
static void onPrevBtnHeld(void* userdata);
+ static void onJumpFirstBtn( void* userdata );
+ static void onJumpLastBtn( void* userdata );
virtual void setRightTabBtnOffset( S32 offset ) { }
virtual void setPanelTitle(S32 index, const LLString& title) { }
@@ -223,7 +225,9 @@ public:
protected:
LLButton* mLeftArrowBtn;
+ LLButton* mJumpLeftArrowBtn;
LLButton* mRightArrowBtn;
+ LLButton* mJumpRightArrowBtn;
S32 mRightTabBtnOffset; // Extra room to the right of the tab buttons.
diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp
index f6f7067540..2afa32eccd 100644
--- a/indra/llui/lltextbox.cpp
+++ b/indra/llui/lltextbox.cpp
@@ -328,7 +328,7 @@ void LLTextBox::draw()
void LLTextBox::reshape(S32 width, S32 height, BOOL called_from_parent)
{
// reparse line lengths
- setText(mText);
+ setLineLengths();
LLView::reshape(width, height, called_from_parent);
}
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index f32266faa8..c9a506756a 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -55,6 +55,7 @@ LLImageProviderInterface* LLUI::sImageProvider = NULL;
LLUIAudioCallback LLUI::sAudioCallback = NULL;
LLVector2 LLUI::sGLScaleFactor(1.f, 1.f);
LLWindow* LLUI::sWindow = NULL;
+LLHtmlHelp* LLUI::sHtmlHelp = NULL;
BOOL LLUI::sShowXUINames = FALSE;
//
// Functions
@@ -387,7 +388,7 @@ void gl_corners_2d(S32 left, S32 top, S32 right, S32 bottom, S32 length, F32 max
void gl_draw_image( S32 x, S32 y, LLImageGL* image, const LLColor4& color )
{
- gl_draw_scaled_rotated_image( x, y, image->getWidth(), image->getHeight(), 0.f, image, color );
+ gl_draw_scaled_rotated_image( x, y, image->getWidth(0), image->getHeight(0), 0.f, image, color );
}
void gl_draw_scaled_image(S32 x, S32 y, S32 width, S32 height, LLImageGL* image, const LLColor4& color)
@@ -439,8 +440,8 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border
glColor4fv(color.mV);
- F32 border_width_fraction = (F32)border_width / (F32)image->getWidth();
- F32 border_height_fraction = (F32)border_height / (F32)image->getHeight();
+ F32 border_width_fraction = (F32)border_width / (F32)image->getWidth(0);
+ F32 border_height_fraction = (F32)border_height / (F32)image->getHeight(0);
glBegin(GL_QUADS);
{
@@ -573,7 +574,7 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 border_width, S32 border
void gl_draw_rotated_image(S32 x, S32 y, F32 degrees, LLImageGL* image, const LLColor4& color)
{
- gl_draw_scaled_rotated_image( x, y, image->getWidth(), image->getHeight(), degrees, image, color );
+ gl_draw_scaled_rotated_image( x, y, image->getWidth(0), image->getHeight(0), degrees, image, color );
}
void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degrees, LLImageGL* image, const LLColor4& color)
@@ -1766,3 +1767,9 @@ LLUUID LLUI::findAssetUUIDByName(const LLString &asset_name)
}
return LLUUID( foundValue );
}
+
+// static
+void LLUI::setHtmlHelp(LLHtmlHelp* html_help)
+{
+ LLUI::sHtmlHelp = html_help;
+}
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index 282e41a113..c8c244072e 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -15,6 +15,7 @@
#include "llcontrol.h"
#include "llrect.h"
#include "llcoord.h"
+#include "llhtmlhelp.h"
class LLColor4;
class LLVector3;
@@ -151,6 +152,7 @@ public:
static void setLineWidth(F32 width);
static LLUUID findAssetUUIDByName(const LLString& name);
static LLVector2 getWindowSize();
+ static void setHtmlHelp(LLHtmlHelp* html_help);
public:
static LLControlGroup* sConfigGroup;
static LLControlGroup* sColorsGroup;
@@ -160,6 +162,7 @@ public:
static LLVector2 sGLScaleFactor;
static LLWindow* sWindow;
static BOOL sShowXUINames;
+ static LLHtmlHelp* sHtmlHelp;
};
// UI widgets
diff --git a/indra/lscript/lscript_compile/lscript_tree.cpp b/indra/lscript/lscript_compile/lscript_tree.cpp
index 8b6ec2ad0c..ae2a0c8afe 100644
--- a/indra/lscript/lscript_compile/lscript_tree.cpp
+++ b/indra/lscript/lscript_compile/lscript_tree.cpp
@@ -251,7 +251,6 @@ void LLScriptConstantString::recurse(FILE *fp, S32 tabs, S32 tabsize, LSCRIPTCom
break;
case LSCP_EMIT_ASSEMBLY:
fprintf(fp, "PUSHARGS \"%s\"\n", mValue);
- fprintf(fp, "STACKTOS %lu\n", strlen(mValue) + 1); /*Flawfinder: ignore*/
break;
case LSCP_TYPE:
type = mType;
diff --git a/indra/lscript/lscript_execute/lscript_execute.cpp b/indra/lscript/lscript_execute/lscript_execute.cpp
index 4521c7b43c..9f123025ff 100644
--- a/indra/lscript/lscript_execute/lscript_execute.cpp
+++ b/indra/lscript/lscript_execute/lscript_execute.cpp
@@ -3337,6 +3337,7 @@ BOOL run_cast(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
BOOL run_stacktos(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
{
+ offset++;
S32 length = lscript_pop_int(buffer);
S32 i;
char *arg = new char[length];
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index 17e24277f0..28b1ddc131 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -153,21 +153,8 @@ RenderLighting 1 0
RenderParticleCount 1 2048
RenderTerrainDetail 1 0
-list GeForce3
-
-list ATI
-
-list Radeon8500
-RenderLighting 1 0
-RenderParticleCount 1 4096
-
-// Hacked to be paranoid "safe"
-list Radeon9700
-RenderParticleCount 1 4096
-
-// Hacked to be paranoid "safe"
-list MobilityRadeon9000
-RenderLighting 1 0
-RenderParticleCount 1 4096
+list ATI_Mobility_Radeon_X3xx
+VertexShaderEnable 1 0
-list GeForceFX
+list ATI_Mobility_Radeon_X6xx
+VertexShaderEnable 1 0
diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt
index 92f9b446f8..49b199c0a4 100644
--- a/indra/newview/gpu_table.txt
+++ b/indra/newview/gpu_table.txt
@@ -22,6 +22,8 @@ ATI All-in-Wonder X1800 .*ATI.*All-in-Wonder X18.* 3
ATI All-in-Wonder X1900 .*ATI.*All-in-Wonder X19.* 3
ATI ASUS X1xxx .*ASUS X1.* 3
ATI Mobility Radeon X1xxx .*ATI.*Mobility.*X1.* 2
+ATI Mobility Radeon X3xx .*ATI.*Mobility.*X3.* 1
+ATI Mobility Radeon X6xx .*ATI.*Mobility.*X6.* 1
ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 3
ATI Diamond X1xxx .*ATI.*Diamond.*X1.* 3
ATI FireGL 5xxx .*ATI.*FireGL V5.* 3
diff --git a/indra/newview/linux_tools/client-readme.txt b/indra/newview/linux_tools/client-readme.txt
index 7c972bb8d1..cabb0345db 100644
--- a/indra/newview/linux_tools/client-readme.txt
+++ b/indra/newview/linux_tools/client-readme.txt
@@ -10,8 +10,16 @@ Life itself - please see <http://www.secondlife.com/whatis/>.
3. Installing & Running
4. Known Issues
5. Troubleshooting
+ 5.1. 'Error creating window.'
+ 5.2. System hangs
+ 5.3. 'Shiny' and client performance
+ 5.4. Audio
+ 5.5. 'Alt' key for camera controls doesn't work
6. Advanced Troubleshooting
-7. Getting more help, and reporting problems
+ 6.1. Audio
+ 6.2. OpenGL
+7. Obtaining and working with the client source code
+8. Getting more help, and reporting problems
1. INTRODUCTION
@@ -28,6 +36,11 @@ with your system. Be aware that although the client itself is provided
for testing purposes, any changes you make within the Second Life world
are permanent.
+You will have either obtained this client from secondlife.com (the official
+site) or from a third-party packager; if you encounter any problems then
+we recommend trying the latest official builds from secondlife.com which are
+updated often.
+
Please enjoy!
@@ -37,10 +50,10 @@ Please enjoy!
Minimum requirements:
* Internet Connection: Cable or DSL
* Computer Processor: 800MHz Pentium III or Athlon, or better
- * Computer Memory: 256MB or better
+ * Computer Memory: 256MB or better (strongly recommend more!)
* Linux Operating System: A reasonably modern 32-bit Linux environment
- is required. If you are running a 64-bit Linux distribution, you
- may need a set of 32-bit compatibility libraries.
+ is required. If you are running a 64-bit Linux distribution then
+ you will need its 32-bit compatibility environment installed.
* Video/Graphics Card:
o nVidia GeForce 2, GeForce 4mx, or better
o OR ATI Radeon 8500, 9250, or better
@@ -125,7 +138,7 @@ SOLUTION:- Usually this indicates that your graphics card does not meet
PROBLEM 2:- My whole system seems to hang when running Second Life.
SOLUTION:- This is typically a hardware/driver issue. The first thing to
do is to check that you have the most recent official drivers for your
- graphics card.
+ graphics card (see PROBLEM 1).
SOLUTION:- Some residents with ATI cards have reported that running
'sudo aticonfig --locked-userpages=off' before running Second Life solves
their stability issues.
@@ -147,6 +160,9 @@ SOLUTION:- Some graphics performance features in Second Life are disabled
automatically used, and some new options in Preferences will now be
available to you; there is no guarantee, however, that they will
positively affect performance!
+SOLUTION:- If you are not running an official Second Life client obtained from
+ secondlife.com, you should consider doing so as you may find its
+ performance to be superior to third-party versions.
PROBLEM 4:- Sound effects seem to 'lag' a fraction of a second behind
actions.
@@ -154,6 +170,13 @@ SOLUTION:- You may uncomment the 'LL_BAD_ESD' line in the 'secondlife' script
to get more responsive audio. However, if you do this then you may
encounter audio issues or a hang during login, so beware.
+PROBLEM 5:- Using the 'Alt' key to control the camera doesn't work or just
+ moves the Second Life window.
+SOLUTION:- Some window managers eat the Alt key for their own purposes; you
+ can configure your window manager to use a different key instead (for
+ example, the 'Windows' key!) which will allow the Alt key to function
+ properly with mouse actions in Second Life and other applications.
+
6. ADVANCED TROUBLESHOOTING
-=-=-=-=-=-=-=-=-=-=-=-=-=-
@@ -178,15 +201,28 @@ configuration options for advanced troubleshooters.
LL_GL_BASICEXT and LL_GL_NOEXT should be commented-out for this to be useful.
-7. GETTING MORE HELP AND REPORTING PROBLEMS
+7. OBTAINING AND WORKING WITH THE CLIENT SOURCE CODE
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+We're pleased to have released the Second Life client's source code under
+an Open Source license compatible with the 'GPL'. To get involved with client
+development, please see:
+<http://wiki.secondlife.com/wiki/Open_Source_Portal>
+
+
+8. GETTING MORE HELP AND REPORTING PROBLEMS
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
For general help and support with Second Life:
<http://secondlife.com/community/support.php>
+For problems and discussion concerning unofficial (not secondlife.com)
+releases, please contact your packager or the SLDev mailing list:
+<https://lists.secondlife.com/cgi-bin/mailman/listinfo/sldev>
+
In-world help: Please use the 'Help' menu in the client for general
non-Linux-specific Second Life help including live support from the fabulous
-Live Help team.
+'Help Request' team.
In-world discussion: There is a 'Linux Client Users' group
inside Second Life which is free to join. You can find it by pressing
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 77bbc1ca81..5af5353c1b 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -82,7 +82,6 @@ void LLDrawable::init()
mVObjp = NULL;
// mFaces
mSpatialGroupp = NULL;
- mSpatialGroupOffset = -1;
mVisible = 0;
mRadius = 0.f;
mSunShadowFactor = 1.f;
@@ -1026,18 +1025,13 @@ void LLDrawable::updateUVMinMax()
{
}
-void LLDrawable::setSpatialGroup(LLSpatialGroup *groupp, const S32 offset)
+void LLDrawable::setSpatialGroup(LLSpatialGroup *groupp)
{
- mSpatialGroupp = groupp;
-
- if (mSpatialGroupp)
+ if (mSpatialGroupp && (groupp != mSpatialGroupp))
{
- mSpatialGroupOffset = offset;
+ mSpatialGroupp->setState(LLSpatialGroup::GEOM_DIRTY);
}
- else
- {
- mSpatialGroupOffset = -1;
- }
+ mSpatialGroupp = groupp;
}
LLSpatialPartition* LLDrawable::getSpatialPartition()
@@ -1411,13 +1405,13 @@ void LLSpatialBridge::cleanupReferences()
LLDrawable::cleanupReferences();
if (mDrawable)
{
- mDrawable->setSpatialGroup(NULL, -1);
+ mDrawable->setSpatialGroup(NULL);
for (U32 i = 0; i < mDrawable->getChildCount(); i++)
{
LLDrawable* drawable = mDrawable->getChild(i);
- if (drawable && drawable->getVOVolume())
+ if (drawable)
{
- drawable->setSpatialGroup(NULL, -1);
+ drawable->setSpatialGroup(NULL);
}
}
diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h
index fef8b02ad5..e95437f4ec 100644
--- a/indra/newview/lldrawable.h
+++ b/indra/newview/lldrawable.h
@@ -170,7 +170,7 @@ public:
// Debugging methods
S32 findReferences(LLDrawable *drawablep); // Not const because of @#$! iterators...
- void setSpatialGroup(LLSpatialGroup *groupp, const S32 offset);
+ void setSpatialGroup(LLSpatialGroup *groupp);
LLSpatialGroup *getSpatialGroup() const { return mSpatialGroupp; }
LLSpatialPartition* getSpatialPartition();
@@ -287,7 +287,6 @@ protected:
face_list_t mFaces;
LLSpatialGroup* mSpatialGroupp;
LLPointer<LLDrawable> mSpatialBridge;
- S32 mSpatialGroupOffset;
mutable U32 mVisible;
F32 mRadius;
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index a0cc189c46..d8b923c271 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -79,7 +79,6 @@ LLDrawPool *LLDrawPoolAvatar::instancePool()
}
BOOL gRenderAvatar = TRUE;
-static LLMatrix4 sModelViewMatrix = LLMatrix4();
S32 LLDrawPoolAvatar::getVertexShaderLevel() const
{
@@ -103,7 +102,14 @@ void LLDrawPoolAvatar::prerender()
LLMatrix4& LLDrawPoolAvatar::getModelView()
{
- return sModelViewMatrix;
+ static LLMatrix4 ret;
+
+ ret.initRows(LLVector4(gGLModelView+0),
+ LLVector4(gGLModelView+4),
+ LLVector4(gGLModelView+8),
+ LLVector4(gGLModelView+12));
+
+ return ret;
}
//-----------------------------------------------------------------------------
@@ -132,7 +138,6 @@ void LLDrawPoolAvatar::beginRenderPass(S32 pass)
beginFootShadow();
break;
case 1:
- glGetFloatv(GL_MODELVIEW_MATRIX, (F32*) sModelViewMatrix.mMatrix);
beginRigid();
break;
case 2:
@@ -507,7 +512,6 @@ void LLDrawPoolAvatar::renderForSelect()
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glGetFloatv(GL_MODELVIEW_MATRIX, (F32*) sModelViewMatrix.mMatrix);
sVertexProgram = &gAvatarPickProgram;
if (sShaderLevel > 0)
{
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index f0f7130e0b..67f60ffdfa 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -16,6 +16,7 @@
#include "llimagegl.h"
#include "m3math.h"
#include "m4math.h"
+#include "v4math.h"
#include "llagent.h"
#include "llcubemap.h"
@@ -182,6 +183,11 @@ void LLDrawPoolBump::render(S32 pass)
{
LLFastTimer t(LLFastTimer::FTM_RENDER_BUMP);
+ if (!gPipeline.hasRenderType(LLDrawPool::POOL_SIMPLE))
+ {
+ return;
+ }
+
switch( pass )
{
case 0:
@@ -237,7 +243,10 @@ void LLDrawPoolBump::beginShiny()
if (LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_OBJECT) > 0)
{
LLMatrix4 mat;
- glGetFloatv(GL_MODELVIEW_MATRIX, (F32*) mat.mMatrix);
+ mat.initRows(LLVector4(gGLModelView+0),
+ LLVector4(gGLModelView+4),
+ LLVector4(gGLModelView+8),
+ LLVector4(gGLModelView+12));
gObjectShinyProgram.bind();
LLVector3 vec = LLVector3(gShinyOrigin) * mat;
LLVector4 vec4(vec, gShinyOrigin.mV[3]);
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index e3b5a2bb68..7d7c2017aa 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -173,7 +173,7 @@ BOOL LLFeatureManager::maskFeatures(const char *name)
LLFeatureList *maskp = findMask(name);
if (!maskp)
{
- llwarns << "Unknown feature mask " << name << llendl;
+// llwarns << "Unknown feature mask " << name << llendl;
return FALSE;
}
llinfos << "Applying Feature Mask: " << name << llendl;
@@ -431,14 +431,6 @@ void LLFeatureManager::initGraphicsFeatureMasks()
{
maskFeatures("ATI");
}
- if (gGLManager.mIsRadeon8500)
- {
- maskFeatures("Radeon8500");
- }
- if (gGLManager.mIsRadeon9700)
- {
- maskFeatures("Radeon9700");
- }
if (gGLManager.mIsGFFX)
{
maskFeatures("GeForceFX");
@@ -451,11 +443,18 @@ void LLFeatureManager::initGraphicsFeatureMasks()
{
maskFeatures("OpenGLPre15");
}
-
- if (gGLManager.mIsMobilityRadeon9000)
+ // Replaces ' ' with '_' in mGPUString to deal with inability for parser to handle spaces
+ std::string gpustr = mGPUString;
+ for (std::string::iterator iter = gpustr.begin(); iter != gpustr.end(); ++iter)
{
- maskFeatures("MobilityRadeon9000");
+ if (*iter == ' ')
+ {
+ *iter = '_';
+ }
}
+// llinfos << "Masking features from gpu table match: " << gpustr << llendl;
+ maskFeatures(gpustr.c_str());
+
if (isSafe())
{
maskFeatures("safe");
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index 5ced5eafb7..63b5262ced 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -93,7 +93,7 @@ LLFloaterAbout::LLFloaterAbout()
// CPU
support.append("CPU: ");
- support.append( gSysCPU.getCPUStringTerse() );
+ support.append( gSysCPU.getCPUString() );
support.append("\n");
U32 memory = gSysMemory.getPhysicalMemory() / 1024 / 1024;
diff --git a/indra/newview/llfloateravatartextures.cpp b/indra/newview/llfloateravatartextures.cpp
index 293bf61a0d..59df3bc2e2 100644
--- a/indra/newview/llfloateravatartextures.cpp
+++ b/indra/newview/llfloateravatartextures.cpp
@@ -78,6 +78,7 @@ void LLFloaterAvatarTextures::draw()
LLFloater::draw();
}
+#if !LL_RELEASE_FOR_DOWNLOAD
static void update_texture_ctrl(LLVOAvatar* avatarp,
LLTextureCtrl* ctrl,
LLVOAvatar::ETextureIndex te)
@@ -115,7 +116,6 @@ static LLVOAvatar* find_avatar(const LLUUID& id)
void LLFloaterAvatarTextures::refresh()
{
-#if !LL_RELEASE_FOR_DOWNLOAD
LLVOAvatar *avatarp = find_avatar(mID);
if (avatarp)
{
@@ -158,9 +158,16 @@ void LLFloaterAvatarTextures::refresh()
{
setTitle(mTitle + ": INVALID AVATAR (" + mID.asString() + ")");
}
-#endif
}
+#else
+
+void LLFloaterAvatarTextures::refresh()
+{
+}
+
+#endif
+
// static
void LLFloaterAvatarTextures::onClickDump(void* data)
{
diff --git a/indra/newview/llfloaterfriends.cpp b/indra/newview/llfloaterfriends.cpp
index 6f31cbb3a0..534aac077f 100644
--- a/indra/newview/llfloaterfriends.cpp
+++ b/indra/newview/llfloaterfriends.cpp
@@ -526,38 +526,51 @@ void LLFloaterFriends::requestFriendship(const LLUUID& target_id, const LLString
IM_FRIENDSHIP_OFFERED);
}
+struct LLAddFriendData
+{
+ LLUUID mID;
+ std::string mName;
+};
+
// static
-void LLFloaterFriends::callbackAddFriend(S32 option, void* user_data)
+void LLFloaterFriends::callbackAddFriend(S32 option, void* data)
{
+ LLAddFriendData* add = (LLAddFriendData*)data;
if (option == 0)
{
- LLFloaterFriends* self = (LLFloaterFriends*)user_data;
- requestFriendship(self->mAddFriendID, self->mAddFriendName);
+ requestFriendship(add->mID, add->mName);
}
+ delete add;
}
// static
void LLFloaterFriends::onPickAvatar(const std::vector<std::string>& names,
const std::vector<LLUUID>& ids,
- void* user_data)
+ void* )
{
if (names.empty()) return;
if (ids.empty()) return;
+ requestFriendshipDialog(ids[0], names[0]);
+}
- LLFloaterFriends* self = (LLFloaterFriends*)user_data;
- self->mAddFriendID = ids[0];
- self->mAddFriendName = names[0];
-
- if(ids[0] == gAgentID)
+// static
+void LLFloaterFriends::requestFriendshipDialog(const LLUUID& id,
+ const std::string& name)
+{
+ if(id == gAgentID)
{
LLNotifyBox::showXml("AddSelfFriend");
return;
}
+ LLAddFriendData* data = new LLAddFriendData();
+ data->mID = id;
+ data->mName = name;
+
// TODO: accept a line of text with this dialog
LLString::format_map_t args;
- args["[NAME]"] = names[0];
- gViewerWindow->alertXml("AddFriend", args, callbackAddFriend, user_data);
+ args["[NAME]"] = name;
+ gViewerWindow->alertXml("AddFriend", args, callbackAddFriend, data);
}
// static
diff --git a/indra/newview/llfloaterfriends.h b/indra/newview/llfloaterfriends.h
index a71b53f206..c6ef365517 100644
--- a/indra/newview/llfloaterfriends.h
+++ b/indra/newview/llfloaterfriends.h
@@ -53,7 +53,14 @@ public:
// Toggles visibility of floater
static void toggle(void* unused = NULL);
- static void requestFriendship(const LLUUID& target_id, const LLString& target_name);
+ // Show a dialog explaining what friendship entails, then request
+ // friendship. JC
+ static void requestFriendshipDialog(const LLUUID& target_id,
+ const std::string& target_name);
+
+ // Just request friendship, no dialog.
+ static void requestFriendship(const LLUUID& target_id,
+ const LLString& target_name);
private:
diff --git a/indra/newview/llhudrender.cpp b/indra/newview/llhudrender.cpp
index 9b74b3963b..72c114d966 100644
--- a/indra/newview/llhudrender.cpp
+++ b/indra/newview/llhudrender.cpp
@@ -77,12 +77,9 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,
LLVector3 render_pos = pos_agent + (floorf(x_offset) * right_axis) + (floorf(y_offset) * up_axis);
//get the render_pos in screen space
- F64 modelview[16];
- F64 projection[16];
- GLint viewport[4];
- glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
- glGetDoublev(GL_PROJECTION_MATRIX, projection);
- glGetIntegerv(GL_VIEWPORT, viewport);
+ F64* modelview = gGLModelView;
+ F64* projection = gGLProjection;
+ GLint* viewport = (GLint*) gGLViewport;
F64 winX, winY, winZ;
gluProject(render_pos.mV[0], render_pos.mV[1], render_pos.mV[2],
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index 1050070f81..5c32f8d90a 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -219,8 +219,6 @@ void LLNetMap::draw()
mCurPanY = lerp(mCurPanY, mTargetPanY, LLCriticalDamp::getInterpolant(0.1f));
// Prepare a scissor region
- // GLint params[4];
- // glGetIntegerv( GL_SCISSOR_BOX, params );
F32 rotation = 0;
{
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 05bd59593d..1b0c731ea9 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -10,6 +10,7 @@
#include "llpanelavatar.h"
+#include "llclassifiedflags.h"
#include "llfontgl.h"
#include "llcachename.h"
@@ -24,6 +25,8 @@
#include "llcallingcard.h"
#include "llcheckboxctrl.h"
#include "llfloater.h"
+
+#include "llfloaterfriends.h"
#include "llfloatergroupinfo.h"
#include "llfloaterworldmap.h"
#include "llfloatermute.h"
@@ -446,7 +449,8 @@ BOOL LLPanelAvatarSecondLife::postBuild(void)
childSetAction("Show on Map", LLPanelAvatar::onClickTrack, getPanelAvatar());
childSetAction("Instant Message...", LLPanelAvatar::onClickIM, getPanelAvatar());
- childSetAction("Rate...", LLPanelAvatar::onClickRate, getPanelAvatar());
+ //childSetAction("Rate...", LLPanelAvatar::onClickRate, getPanelAvatar());
+ childSetAction("Add Friend...", LLPanelAvatar::onClickAddFriend, getPanelAvatar());
childSetAction("Pay...", LLPanelAvatar::onClickPay, getPanelAvatar());
childSetAction("Mute", LLPanelAvatar::onClickMute, getPanelAvatar() );
@@ -839,9 +843,9 @@ void LLPanelAvatarClassified::refresh()
S32 tab_count = tabs ? tabs->getTabCount() : 0;
- BOOL allow_new = TRUE; //tab_count < MAX_CLASSIFIEDS;
- BOOL allow_delete = (tab_count > 0);
- BOOL show_help = (tab_count == 0);
+ bool allow_new = tab_count < MAX_CLASSIFIEDS;
+ bool allow_delete = (tab_count > 0);
+ bool show_help = (tab_count == 0);
childSetEnabled("New...",self && allow_new);
childSetEnabled("Delete...",self && allow_delete);
@@ -904,9 +908,8 @@ void LLPanelAvatarClassified::processAvatarClassifiedReply(LLMessageSystem* msg,
LLTabContainerCommon* tabs = LLViewerUICtrlFactory::getTabContainerByName(this,"classified tab");
- // Clear out all the old panels.
- // We'll replace them with the correct number of new panels.
- deleteClassifiedPanels();
+ // Don't remove old panels. We need to be able to process multiple
+ // packets for people who have lots of classifieds. JC
block_count = msg->getNumberOfBlocksFast(_PREHASH_Data);
for (block = 0; block < block_count; block++)
@@ -1434,6 +1437,8 @@ void LLPanelAvatar::setAvatarID(const LLUUID &avatar_id, const LLString &name,
childSetEnabled("Show on Map",FALSE);
childSetVisible("Rate...",FALSE);
childSetEnabled("Rate...",FALSE);
+ childSetVisible("Add Friend...",FALSE);
+ childSetEnabled("Add Friend...",FALSE);
childSetVisible("Pay...",FALSE);
childSetEnabled("Pay...",FALSE);
}
@@ -1472,6 +1477,8 @@ void LLPanelAvatar::setAvatarID(const LLUUID &avatar_id, const LLString &name,
}
childSetVisible("Rate...",TRUE);
childSetEnabled("Rate...",FALSE);
+ childSetVisible("Add Friend...", true);
+ childSetEnabled("Add Friend...", true);
childSetVisible("Pay...",TRUE);
childSetEnabled("Pay...",FALSE);
}
@@ -1580,6 +1587,18 @@ void LLPanelAvatar::onClickRate(void *userdata)
LLFloaterRate::show(self->mAvatarID);
}
+// static
+void LLPanelAvatar::onClickAddFriend(void* userdata)
+{
+ LLPanelAvatar* self = (LLPanelAvatar*) userdata;
+ LLNameEditor* name_edit = LLViewerUICtrlFactory::getNameEditorByName(self->mPanelSecondLife, "name");
+ if (name_edit)
+ {
+ LLFloaterFriends::requestFriendshipDialog(self->getAvatarID(),
+ name_edit->getText());
+ }
+}
+
//-----------------------------------------------------------------------------
// onClickMute()
//-----------------------------------------------------------------------------
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index be6feebc30..994d23b7d3 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -289,6 +289,7 @@ public:
static void onClickOfferTeleport( void *userdata);
static void onClickPay( void *userdata);
static void onClickRate( void *userdata);
+ static void onClickAddFriend(void* userdata);
static void onClickOK( void *userdata);
static void onClickCancel( void *userdata);
static void onClickKick( void *userdata);
@@ -296,7 +297,6 @@ public:
static void onClickUnfreeze(void *userdata);
static void onClickCSR( void *userdata);
static void onClickMute( void *userdata);
- static void onClickAddFriend(void* data);
static void finishKick(S32 option, const LLString& text, void* userdata);
static void finishFreeze(S32 option, const LLString& text, void* userdata);
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 94773e21ba..58a5969792 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -382,7 +382,7 @@ BOOL LLPanelLogin::handleKeyHere(KEY key, MASK mask, BOOL called_from_parent)
if ( KEY_F1 == key )
{
llinfos << "Spawning HTML help window" << llendl;
- LLHtmlHelp::show();
+ gViewerHtmlHelp.show();
return TRUE;
};
#if ! LL_RELEASE_FOR_DOWNLOAD
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 4b7be3701b..b8f1e51e9e 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -457,7 +457,7 @@ void LLPreviewTexture::updateAspectRatio()
void LLPreviewTexture::loadAsset()
{
- mImage = gImageList.getImage(mImageID, MIPMAP_FALSE, FALSE);
+ mImage = gImageList.getImage(mImageID, MIPMAP_TRUE, FALSE);
mImage->setBoostLevel(LLViewerImage::BOOST_PREVIEW);
mAssetStatus = PREVIEW_ASSET_LOADING;
}
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index d8d9f1c5d6..333ed91e4a 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -126,7 +126,7 @@ LLSpatialGroup::~LLSpatialGroup()
{
sZombieGroups--;
}
-
+
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
clearDrawMap();
}
@@ -197,10 +197,34 @@ void LLSpatialGroup::validate()
#if LL_OCTREE_PARANOIA_CHECK
sg_assert(!isState(DIRTY));
+ sg_assert(!isDead());
LLVector3 myMin = mBounds[0] - mBounds[1];
LLVector3 myMax = mBounds[0] + mBounds[1];
+ validateDrawMap();
+
+ for (element_iter i = getData().begin(); i != getData().end(); ++i)
+ {
+ LLDrawable* drawable = *i;
+ sg_assert(drawable->getSpatialGroup() == this);
+ if (drawable->getSpatialBridge())
+ {
+ sg_assert(drawable->getSpatialBridge() == mSpatialPartition->asBridge());
+ }
+
+ if (drawable->isSpatialBridge())
+ {
+ LLSpatialPartition* part = drawable->asPartition();
+ if (!part)
+ {
+ llerrs << "Drawable reports it is a spatial bridge but not a partition." << llendl;
+ }
+ LLSpatialGroup* group = (LLSpatialGroup*) part->mOctree->getListener(0);
+ group->validate();
+ }
+ }
+
for (U32 i = 0; i < mOctreeNode->getChildCount(); ++i)
{
LLSpatialGroup* group = (LLSpatialGroup*) mOctreeNode->getChild(i)->getListener(0);
@@ -226,8 +250,8 @@ void LLSpatialGroup::validate()
void validate_draw_info(LLDrawInfo& params)
{
-#if LL_DEBUG
-/* if (params.mVertexBuffer.isNull())
+#if LL_OCTREE_PARANOIA_CHECK
+ if (params.mVertexBuffer.isNull())
{
llerrs << "Draw batch has no vertex buffer." << llendl;
}
@@ -238,12 +262,12 @@ void validate_draw_info(LLDrawInfo& params)
llerrs << "Draw batch has invalid range." << llendl;
}
- if (params.mEnd >= params.mVertexBuffer->getNumVerts())
+ if (params.mEnd >= (U32) params.mVertexBuffer->getNumVerts())
{
llerrs << "Draw batch has buffer overrun error." << llendl;
}
- if (params.mOffset + params.mCount > params.mVertexBuffer->getNumIndices())
+ if (params.mOffset + params.mCount > (U32) params.mVertexBuffer->getNumIndices())
{
llerrs << "Draw batch has index buffer ovverrun error." << llendl;
}
@@ -264,13 +288,14 @@ void validate_draw_info(LLDrawInfo& params)
llerrs << "Draw batch has vertex buffer index out of range error (index too high)." << llendl;
}
}
- }*/
+ }
#endif
}
void LLSpatialGroup::validateDrawMap()
{
-/* for (draw_map_t::iterator i = mDrawMap.begin(); i != mDrawMap.end(); ++i)
+#if LL_OCTREE_PARANOIA_CHECK
+ for (draw_map_t::iterator i = mDrawMap.begin(); i != mDrawMap.end(); ++i)
{
std::vector<LLDrawInfo*>& draw_vec = i->second;
for (std::vector<LLDrawInfo*>::iterator j = draw_vec.begin(); j != draw_vec.end(); ++j)
@@ -279,7 +304,8 @@ void LLSpatialGroup::validateDrawMap()
validate_draw_info(params);
}
- }*/
+ }
+#endif
}
void LLSpatialGroup::makeStatic()
@@ -342,7 +368,7 @@ BOOL LLSpatialGroup::addObject(LLDrawable *drawablep, BOOL add_all, BOOL from_oc
}
else
{
- drawablep->setSpatialGroup(this, 0);
+ drawablep->setSpatialGroup(this);
validate_drawable(drawablep);
setState(OBJECT_DIRTY | GEOM_DIRTY);
mLastAddTime = gFrameTimeSeconds;
@@ -554,7 +580,7 @@ BOOL LLSpatialGroup::removeObject(LLDrawable *drawablep, BOOL from_octree)
}
else
{
- drawablep->setSpatialGroup(NULL, -1);
+ drawablep->setSpatialGroup(NULL);
setState(GEOM_DIRTY);
if (drawablep->isSpatialBridge())
{
@@ -867,6 +893,16 @@ void LLSpatialGroup::handleDestruction(const TreeNode* node)
{
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
setState(DEAD);
+
+ for (element_iter i = getData().begin(); i != getData().end(); ++i)
+ {
+ LLDrawable* drawable = *i;
+ if (drawable->getSpatialGroup() == this)
+ {
+ drawable->setSpatialGroup(NULL);
+ }
+ }
+
clearDrawMap();
mOcclusionVerts = NULL;
mVertexBuffer = NULL;
@@ -1108,7 +1144,7 @@ BOOL LLSpatialPartition::remove(LLDrawable *drawablep, LLSpatialGroup *curp)
{
LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
- drawablep->setSpatialGroup(NULL, -1);
+ drawablep->setSpatialGroup(NULL);
if (!curp->removeObject(drawablep))
{
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index f3a2c629fd..baf6abda11 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -328,13 +328,16 @@ BOOL idle_startup()
{
gViewerWindow->alertXml("DisplaySetToSafe");
}
- else if (gSavedSettings.getS32("LastFeatureVersion") < gFeatureManagerp->getVersion())
+ else if ((gSavedSettings.getS32("LastFeatureVersion") < gFeatureManagerp->getVersion()) &&
+ (gSavedSettings.getS32("LastFeatureVersion") != 0))
{
- if (gSavedSettings.getS32("LastFeatureVersion") != 0)
- {
- gViewerWindow->alertXml("DisplaySetToRecommended");
- }
+ gViewerWindow->alertXml("DisplaySetToRecommended");
}
+ else if (!gViewerWindow->getInitAlert().empty())
+ {
+ gViewerWindow->alertXml(gViewerWindow->getInitAlert());
+ }
+
gSavedSettings.setS32("LastFeatureVersion", gFeatureManagerp->getVersion());
LLString xml_file = LLUI::locateSkin("xui_version.xml");
diff --git a/indra/newview/llsurfacepatch.cpp b/indra/newview/llsurfacepatch.cpp
index 4be7cf41e7..8d30ebbcda 100644
--- a/indra/newview/llsurfacepatch.cpp
+++ b/indra/newview/llsurfacepatch.cpp
@@ -183,6 +183,11 @@ LLVector2 LLSurfacePatch::getTexCoords(const U32 x, const U32 y) const
void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3 *vertex, LLVector3 *normal,
LLVector2 *tex0, LLVector2 *tex1)
{
+ if (!mSurfacep || !mSurfacep->getRegion())
+ {
+ return; // failsafe
+ }
+
U32 surface_stride = mSurfacep->getGridsPerEdge();
U32 point_offset = x + y*surface_stride;
diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp
index 2c7c892807..a155a7aeec 100644
--- a/indra/newview/llviewercamera.cpp
+++ b/indra/newview/llviewercamera.cpp
@@ -77,6 +77,7 @@ void LLViewerCamera::updateCameraLocation(const LLVector3 &center,
// Handy copies of last good GL matrices
F64 gGLModelView[16];
+F64 gGLProjection[16];
S32 gGLViewport[4];
const LLMatrix4 &LLViewerCamera::getProjection() const
@@ -231,6 +232,7 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
aspect,
z_near,
z_far);
+ glGetDoublev(GL_PROJECTION_MATRIX, gGLProjection);
glGetFloatv(GL_PROJECTION_MATRIX, (float*)&gProjectionMat);
glMatrixMode( GL_MODELVIEW );
diff --git a/indra/newview/llviewercamera.h b/indra/newview/llviewercamera.h
index 6ce1dcc046..b28aac269b 100644
--- a/indra/newview/llviewercamera.h
+++ b/indra/newview/llviewercamera.h
@@ -90,6 +90,7 @@ public:
extern LLViewerCamera *gCamera;
extern F64 gGLModelView[16];
+extern F64 gGLProjection[16];
extern S32 gGLViewport[4];
#endif // LL_LLVIEWERCAMERA_H
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index df5b0f1182..ee878c1dc0 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -577,11 +577,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield)
gPipeline.stateSort(hud_cam);
}
- if (LLVertexBuffer::sEnableVBOs)
- {
- LLImageGL::sBoundTextureMemory += LLVertexBuffer::sAllocatedBytes;
- }
-
gPipeline.renderGeom(hud_cam);
//restore type mask
@@ -800,8 +795,10 @@ void render_ui_2d()
glPushMatrix();
S32 half_width = (gViewerWindow->getWindowWidth() / 2);
S32 half_height = (gViewerWindow->getWindowHeight() / 2);
+ glScalef(LLUI::sGLScaleFactor.mV[0], LLUI::sGLScaleFactor.mV[1], 1.f);
glTranslatef((F32)half_width, (F32)half_height, 0.f);
- glScalef(gAgent.getAvatarObject()->mHUDCurZoom, gAgent.getAvatarObject()->mHUDCurZoom, gAgent.getAvatarObject()->mHUDCurZoom);
+ F32 zoom = gAgent.getAvatarObject()->mHUDCurZoom;
+ glScalef(zoom,zoom,1.f);
glColor4fv(LLColor4::white.mV);
gl_rect_2d(-half_width, half_height, half_width, -half_height, FALSE);
glPopMatrix();
diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp
index 123dcc8eb4..9bb4aa4cf9 100644
--- a/indra/newview/llviewerjointmesh.cpp
+++ b/indra/newview/llviewerjointmesh.cpp
@@ -47,7 +47,6 @@ static LLPointer<LLVertexBuffer> sRenderBuffer = NULL;
static const U32 sRenderMask = LLVertexBuffer::MAP_VERTEX |
LLVertexBuffer::MAP_NORMAL |
LLVertexBuffer::MAP_TEXCOORD;
-LLMatrix4 gBlendMat;
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
@@ -884,89 +883,108 @@ BOOL LLViewerJointMesh::updateLOD(F32 pixel_area, BOOL activate)
return (valid != activate);
}
+
void LLViewerJointMesh::updateGeometry()
{
- if (mValid && mMesh && mFace &&
- mMesh->hasWeights() &&
- mFace->mVertexBuffer.notNull() &&
- LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR) == 0)
+ if (!(mValid
+ && mMesh
+ && mFace
+ && mMesh->hasWeights()
+ && mFace->mVertexBuffer.notNull()
+ && LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR) == 0))
{
- uploadJointMatrices();
- LLStrider<LLVector3> o_vertices;
- LLStrider<LLVector3> o_normals;
+ return;
+ }
+
+ uploadJointMatrices();
- //get vertex and normal striders
- LLVertexBuffer *buffer = mFace->mVertexBuffer;
- buffer->getVertexStrider(o_vertices, 0);
- buffer->getNormalStrider(o_normals, 0);
+ LLStrider<LLVector3> o_vertices;
+ LLStrider<LLVector3> o_normals;
+ //get vertex and normal striders
+ LLVertexBuffer *buffer = mFace->mVertexBuffer;
+ buffer->getVertexStrider(o_vertices, 0);
+ buffer->getNormalStrider(o_normals, 0);
+
+ F32 last_weight = F32_MAX;
+ LLMatrix4 gBlendMat;
+ LLMatrix3 gBlendRotMat;
+
+ const F32* weights = mMesh->getWeights();
+ const LLVector3* coords = mMesh->getCoords();
+ const LLVector3* normals = mMesh->getNormals();
+ for (U32 index = 0; index < mMesh->getNumVertices(); index++)
+ {
+ U32 bidx = index + mMesh->mFaceVertexOffset;
+
+ // blend by first matrix
+ F32 w = weights[index];
+
+ // Maybe we don't have to change gBlendMat.
+ // Profiles of a single-avatar scene on a Mac show this to be a very
+ // common case. JC
+ if (w == last_weight)
{
- LLVector4 tpos0, tnorm0, tpos1, tnorm1, tbinorm0, tbinorm1;
- F32 last_weight = F32_MAX;
- LLMatrix3 gBlendRotMat;
+ o_vertices[bidx] = coords[index] * gBlendMat;
+ o_normals[bidx] = normals[index] * gBlendRotMat;
+ continue;
+ }
+
+ last_weight = w;
+ S32 joint = llfloor(w);
+ w -= joint;
- for (U32 index= 0; index < mMesh->getNumVertices(); index++)
- {
- // blend by first matrix
- F32 w = mMesh->getWeights()[index];
-
- if (w != last_weight)
- {
- last_weight = w;
-
- S32 joint = llfloor(w);
- w -= joint;
-
- LLMatrix4 &m0 = gJointMat[joint+1];
- LLMatrix4 &m1 = gJointMat[joint+0];
- LLMatrix3 &n0 = gJointRot[joint+1];
- LLMatrix3 &n1 = gJointRot[joint+0];
-
- if (w == 1.0f)
- {
- gBlendMat = m0;
- gBlendRotMat = n0;
- }
- else
- {
- gBlendMat.mMatrix[VX][VX] = lerp(m1.mMatrix[VX][VX], m0.mMatrix[VX][VX], w);
- gBlendMat.mMatrix[VX][VY] = lerp(m1.mMatrix[VX][VY], m0.mMatrix[VX][VY], w);
- gBlendMat.mMatrix[VX][VZ] = lerp(m1.mMatrix[VX][VZ], m0.mMatrix[VX][VZ], w);
-
- gBlendMat.mMatrix[VY][VX] = lerp(m1.mMatrix[VY][VX], m0.mMatrix[VY][VX], w);
- gBlendMat.mMatrix[VY][VY] = lerp(m1.mMatrix[VY][VY], m0.mMatrix[VY][VY], w);
- gBlendMat.mMatrix[VY][VZ] = lerp(m1.mMatrix[VY][VZ], m0.mMatrix[VY][VZ], w);
-
- gBlendMat.mMatrix[VZ][VX] = lerp(m1.mMatrix[VZ][VX], m0.mMatrix[VZ][VX], w);
- gBlendMat.mMatrix[VZ][VY] = lerp(m1.mMatrix[VZ][VY], m0.mMatrix[VZ][VY], w);
- gBlendMat.mMatrix[VZ][VZ] = lerp(m1.mMatrix[VZ][VZ], m0.mMatrix[VZ][VZ], w);
-
- gBlendMat.mMatrix[VW][VX] = lerp(m1.mMatrix[VW][VX], m0.mMatrix[VW][VX], w);
- gBlendMat.mMatrix[VW][VY] = lerp(m1.mMatrix[VW][VY], m0.mMatrix[VW][VY], w);
- gBlendMat.mMatrix[VW][VZ] = lerp(m1.mMatrix[VW][VZ], m0.mMatrix[VW][VZ], w);
-
- gBlendRotMat.mMatrix[VX][VX] = lerp(n1.mMatrix[VX][VX], n0.mMatrix[VX][VX], w);
- gBlendRotMat.mMatrix[VX][VY] = lerp(n1.mMatrix[VX][VY], n0.mMatrix[VX][VY], w);
- gBlendRotMat.mMatrix[VX][VZ] = lerp(n1.mMatrix[VX][VZ], n0.mMatrix[VX][VZ], w);
-
- gBlendRotMat.mMatrix[VY][VX] = lerp(n1.mMatrix[VY][VX], n0.mMatrix[VY][VX], w);
- gBlendRotMat.mMatrix[VY][VY] = lerp(n1.mMatrix[VY][VY], n0.mMatrix[VY][VY], w);
- gBlendRotMat.mMatrix[VY][VZ] = lerp(n1.mMatrix[VY][VZ], n0.mMatrix[VY][VZ], w);
-
- gBlendRotMat.mMatrix[VZ][VX] = lerp(n1.mMatrix[VZ][VX], n0.mMatrix[VZ][VX], w);
- gBlendRotMat.mMatrix[VZ][VY] = lerp(n1.mMatrix[VZ][VY], n0.mMatrix[VZ][VY], w);
- gBlendRotMat.mMatrix[VZ][VZ] = lerp(n1.mMatrix[VZ][VZ], n0.mMatrix[VZ][VZ], w);
- }
- }
+ // No lerp required in this case.
+ if (w == 1.0f)
+ {
+ gBlendMat = gJointMat[joint+1];
+ o_vertices[bidx] = coords[index] * gBlendMat;
+ gBlendRotMat = gJointRot[joint+1];
+ o_normals[bidx] = normals[index] * gBlendRotMat;
+ continue;
+ }
+
+ // Try to keep all the accesses to the matrix data as close
+ // together as possible. This function is a hot spot on the
+ // Mac. JC
+ LLMatrix4 &m0 = gJointMat[joint+1];
+ LLMatrix4 &m1 = gJointMat[joint+0];
+
+ gBlendMat.mMatrix[VX][VX] = lerp(m1.mMatrix[VX][VX], m0.mMatrix[VX][VX], w);
+ gBlendMat.mMatrix[VX][VY] = lerp(m1.mMatrix[VX][VY], m0.mMatrix[VX][VY], w);
+ gBlendMat.mMatrix[VX][VZ] = lerp(m1.mMatrix[VX][VZ], m0.mMatrix[VX][VZ], w);
- // write result
- U32 bidx = index + mMesh->mFaceVertexOffset;
+ gBlendMat.mMatrix[VY][VX] = lerp(m1.mMatrix[VY][VX], m0.mMatrix[VY][VX], w);
+ gBlendMat.mMatrix[VY][VY] = lerp(m1.mMatrix[VY][VY], m0.mMatrix[VY][VY], w);
+ gBlendMat.mMatrix[VY][VZ] = lerp(m1.mMatrix[VY][VZ], m0.mMatrix[VY][VZ], w);
- o_vertices[bidx] = mMesh->getCoords()[index] * gBlendMat;
- o_normals[bidx] = mMesh->getNormals()[index] * gBlendRotMat;
- }
- }
+ gBlendMat.mMatrix[VZ][VX] = lerp(m1.mMatrix[VZ][VX], m0.mMatrix[VZ][VX], w);
+ gBlendMat.mMatrix[VZ][VY] = lerp(m1.mMatrix[VZ][VY], m0.mMatrix[VZ][VY], w);
+ gBlendMat.mMatrix[VZ][VZ] = lerp(m1.mMatrix[VZ][VZ], m0.mMatrix[VZ][VZ], w);
+
+ gBlendMat.mMatrix[VW][VX] = lerp(m1.mMatrix[VW][VX], m0.mMatrix[VW][VX], w);
+ gBlendMat.mMatrix[VW][VY] = lerp(m1.mMatrix[VW][VY], m0.mMatrix[VW][VY], w);
+ gBlendMat.mMatrix[VW][VZ] = lerp(m1.mMatrix[VW][VZ], m0.mMatrix[VW][VZ], w);
+
+ o_vertices[bidx] = coords[index] * gBlendMat;
+
+ LLMatrix3 &n0 = gJointRot[joint+1];
+ LLMatrix3 &n1 = gJointRot[joint+0];
+
+ gBlendRotMat.mMatrix[VX][VX] = lerp(n1.mMatrix[VX][VX], n0.mMatrix[VX][VX], w);
+ gBlendRotMat.mMatrix[VX][VY] = lerp(n1.mMatrix[VX][VY], n0.mMatrix[VX][VY], w);
+ gBlendRotMat.mMatrix[VX][VZ] = lerp(n1.mMatrix[VX][VZ], n0.mMatrix[VX][VZ], w);
+
+ gBlendRotMat.mMatrix[VY][VX] = lerp(n1.mMatrix[VY][VX], n0.mMatrix[VY][VX], w);
+ gBlendRotMat.mMatrix[VY][VY] = lerp(n1.mMatrix[VY][VY], n0.mMatrix[VY][VY], w);
+ gBlendRotMat.mMatrix[VY][VZ] = lerp(n1.mMatrix[VY][VZ], n0.mMatrix[VY][VZ], w);
+
+ gBlendRotMat.mMatrix[VZ][VX] = lerp(n1.mMatrix[VZ][VX], n0.mMatrix[VZ][VX], w);
+ gBlendRotMat.mMatrix[VZ][VY] = lerp(n1.mMatrix[VZ][VY], n0.mMatrix[VZ][VY], w);
+ gBlendRotMat.mMatrix[VZ][VZ] = lerp(n1.mMatrix[VZ][VZ], n0.mMatrix[VZ][VZ], w);
+
+ o_normals[bidx] = normals[index] * gBlendRotMat;
}
}
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 114c90a4d8..e9d2218d55 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -1237,11 +1237,6 @@ void init_debug_rendering_menu(LLMenuGL* menu)
item = new LLMenuItemCheckGL("Cheesy Beacon", menu_toggle_control, NULL, menu_check_control, (void*)"CheesyBeacon");
menu->append(item);
-#if 0 // 1.9.2
- item = new LLMenuItemCheckGL("Vertex Shaders", toggle_vertex_shaders, NULL, check_vertex_shaders, (void*)"VertexShaderEnable", 'V', MASK_CONTROL|MASK_ALT);
- item->setEnabled(gGLManager.mHasVertexShader);
- menu->append(item);
-#endif
menu->createJumpKeys();
}
@@ -6481,7 +6476,7 @@ class LLShowFloater : public view_listener_t
else if (floater_name == "help f1")
{
#if LL_LIBXUL_ENABLED
- LLHtmlHelp::show();
+ gViewerHtmlHelp.show();
#endif
}
else if (floater_name == "help in-world")
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 55256a6f23..cc1beefec5 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1560,7 +1560,17 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
{
return;
}
-
+
+ // System messages, specifically "Foo Bar has left this session"
+ // are not shown unless you actually have that session open.
+ // Band-aid. JC
+ if (offline == IM_ONLINE
+ && chat.mFromName == SYSTEM_FROM
+ && !gIMView->hasSession(session_id))
+ {
+ return;
+ }
+
// standard message, not from system
char saved[MAX_STRING]; /* Flawfinder: ignore */
saved[0] = '\0';
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index bd8ac806f5..7ae166849b 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -4612,6 +4612,13 @@ void LLViewerObject::setRegion(LLViewerRegion *regionp)
llassert(regionp);
mLatestRecvPacketID = 0;
mRegionp = regionp;
+
+ for (child_list_t::iterator i = getChildren().begin(); i != getChildren().end(); ++i)
+ {
+ LLViewerObject* child = *i;
+ child->setRegion(regionp);
+ }
+
setChanged(MOVED | SILHOUETTE);
updateDrawable(FALSE);
}
diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp
index bf09c54100..cb0df92386 100644
--- a/indra/newview/llviewerpartsim.cpp
+++ b/indra/newview/llviewerpartsim.cpp
@@ -230,13 +230,13 @@ void LLViewerPartGroup::removePart(const S32 part_num)
void LLViewerPartGroup::updateParticles(const F32 dt)
{
LLMemType mt(LLMemType::MTYPE_PARTICLES);
- S32 i, count;
+ S32 i;
LLVector3 gravity(0.f, 0.f, -9.8f);
LLViewerRegion *regionp = getRegion();
- count = (S32) mParticles.size();
- for (i = 0; i < count; i++)
+ S32 end = (S32) mParticles.size();
+ for (i = 0; i < end; i++)
{
LLVector3 a(0.f, 0.f, 0.f);
LLViewerPart& part = *((LLViewerPart*) mParticles[i]);
@@ -345,9 +345,8 @@ void LLViewerPartGroup::updateParticles(const F32 dt)
// Kill dead particles (either flagged dead, or too old)
if ((part.mLastUpdateTime > part.mMaxAge) || (LLViewerPart::LL_PART_DEAD_MASK == part.mFlags))
{
- removePart(i);
- i--;
- count--;
+ end--;
+ LLPointer<LLViewerPart>::swap(mParticles[i], mParticles[end]);
}
else
{
@@ -356,13 +355,24 @@ void LLViewerPartGroup::updateParticles(const F32 dt)
{
// Transfer particles between groups
gWorldPointer->mPartSim.put(&part);
- removePart(i);
- i--;
- count--;
+ end--;
+ LLPointer<LLViewerPart>::swap(mParticles[i], mParticles[end]);
}
}
}
+ S32 removed = (S32)mParticles.size() - end;
+ if (removed > 0)
+ {
+ // we removed one or more particles, so flag this group for update
+ mParticles.erase(mParticles.begin() + end, mParticles.end());
+ if (mVOPartGroupp.notNull())
+ {
+ gPipeline.markRebuild(mVOPartGroupp->mDrawable, LLDrawable::REBUILD_ALL, TRUE);
+ }
+ LLViewerPartSim::decPartCount(removed);
+ }
+
// Kill the viewer object if this particle group is empty
if (mParticles.empty())
{
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index 4ebfef3a9b..d81454fa8d 100644
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -1433,12 +1433,14 @@ BOOL LLViewerTextEditor::exportBuffer( LLString& buffer )
{
LLNotecard nc(LLNotecard::MAX_SIZE);
- std::vector<LLPointer<LLInventoryItem> > embedded_items;
- mEmbeddedItemList->getEmbeddedItemList(embedded_items);
-
- nc.setItems(embedded_items);
+ // Get the embedded text and update the item list to just be the used items
nc.setText(getEmbeddedText());
+ // Now get the used items and copy the list to the notecard
+ std::vector<LLPointer<LLInventoryItem> > embedded_items;
+ mEmbeddedItemList->getEmbeddedItemList(embedded_items);
+ nc.setItems(embedded_items);
+
std::stringstream out_stream;
nc.exportStream(out_stream);
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 732568f652..f11f9fb1be 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1450,6 +1450,8 @@ LLViewerWindow::LLViewerWindow(
LLFontManager::initClass();
+ // Initialize OpenGL Renderer
+
if (!gFeatureManagerp->isFeatureAvailable("RenderVBO") ||
!gGLManager.mHasVertexBufferObject)
{
@@ -1475,16 +1477,30 @@ LLViewerWindow::LLViewerWindow(
idx = LLViewerImageList::getMaxVideoRamSetting(-2); // get max recommended setting
gSavedSettings.setS32("GraphicsCardMemorySetting", idx);
}
-
+
+ // If we crashed while initializng GL stuff last time, disable certain features
+ if (gSavedSettings.getBOOL("RenderInitError"))
+ {
+ mInitAlert = "DisplaySettingsNoShaders";
+ gSavedSettings.setBOOL("VertexShaderEnable", FALSE);
+ }
+
if (!gNoRender)
{
//
// Initialize GL stuff
//
+ // Set this flag in case we crash while initializing GL
+ gSavedSettings.setBOOL("RenderInitError", TRUE);
+ gSavedSettings.saveToFile( gSettingsFileName, TRUE );
+
gPipeline.init();
stop_glerror();
initGLDefaults();
+
+ gSavedSettings.setBOOL("RenderInitError", FALSE);
+ gSavedSettings.saveToFile( gSettingsFileName, TRUE );
}
//
@@ -1531,6 +1547,7 @@ LLViewerWindow::LLViewerWindow(
gSavedSettings.getControl("NumpadControl")->firePropertyChanged();
mDebugText = new LLDebugText(this);
+
}
void LLViewerWindow::initGLDefaults()
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 8f3642ffd3..af5ffd7914 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -125,7 +125,9 @@ public:
void getTargetWindow(BOOL& fullscreen, S32& width, S32& height) const;
// The 'target' is where the user wants the window to be. It may not be
// there yet, because we may be supressing fullscreen prior to login.
-
+
+ const LLString& getInitAlert() { return mInitAlert; }
+
//
// MANIPULATORS
//
@@ -319,6 +321,8 @@ protected:
BOOL mIgnoreActivate;
U8* mPickBuffer;
+ LLString mInitAlert; // Window / GL initialization requires an alert
+
class LLDebugText* mDebugText; // Internal class for debug text
protected:
diff --git a/indra/newview/llvlcomposition.cpp b/indra/newview/llvlcomposition.cpp
index 7dd7f2674b..de67506e3f 100644
--- a/indra/newview/llvlcomposition.cpp
+++ b/indra/newview/llvlcomposition.cpp
@@ -265,7 +265,7 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y,
ddiscard++;
min_dim /= 2;
}
- if (!mDetailTextures[i]->readBackRaw(ddiscard, mRawImages[i]))
+ if (!mDetailTextures[i]->readBackRaw(ddiscard, mRawImages[i], false))
{
llwarns << "Unable to read raw data for terrain detail texture: " << mDetailTextures[i]->getID() << llendl;
mRawImages[i] = NULL;
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index f0e797b6e9..e74c286e43 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -6329,7 +6329,7 @@ BOOL LLVOAvatar::getLocalTextureRaw(S32 index, LLImageRaw* image_raw)
}
else
{
- if( mLocalTexture[ index ]->readBackRaw(-1, image_raw) )
+ if( mLocalTexture[ index ]->readBackRaw(-1, image_raw, false) )
{
success = TRUE;
}
@@ -9184,7 +9184,7 @@ void LLVOAvatar::writeCAL3D(std::string& path, std::string& file_base)
continue;
}
LLPointer<LLImageRaw> raw_image = new LLImageRaw;
- viewer_imagep->readBackRaw(-1, raw_image);
+ viewer_imagep->readBackRaw(-1, raw_image, false);
BOOL success = tga_image->encode(raw_image);
success = tga_image->save(filename);
}
@@ -9199,7 +9199,7 @@ void LLVOAvatar::writeCAL3D(std::string& path, std::string& file_base)
else
{
LLPointer<LLImageRaw> raw_image = new LLImageRaw;
- viewer_imagep->readBackRaw(-1, raw_image);
+ viewer_imagep->readBackRaw(-1, raw_image, false);
BOOL success = tga_image->encode(raw_image);
success = tga_image->save(filename);
}
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index 94f9f0b21f..9da6027ab5 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -169,7 +169,7 @@ inline F32 color_intens ( const LLColor4 &col )
inline F32 color_avg ( const LLColor3 &col )
{
- return color_intens(col) / 3;
+ return color_intens(col) / 3.f;
}
inline void color_gamma_correct(LLColor3 &col)
@@ -756,7 +756,7 @@ LLColor3 LLVOSky::calcSkyColorInDir(const LLVector3 &dir)
{
LLColor3 col, transp;
- if (dir.mV[VZ] < -0.02)
+ if (dir.mV[VZ] < -0.02f)
{
col = LLColor3(llmax(mFogColor[0],0.2f), llmax(mFogColor[1],0.2f), llmax(mFogColor[2],0.27f));
float x = 1.0f-fabsf(-0.1f-dir.mV[VZ]);
@@ -806,15 +806,18 @@ void LLVOSky::calcSkyColorInDir(LLColor3& res, LLColor3& transp, const LLVector3
const F32 e_pow_k = (F32)LL_FAST_EXP(K);
F32 step = FIRST_STEP * (1 - 1 / e_pow_k);
+ // Initialize outside the loop because we write into them every iteration. JC
+ LLColor3 air_sca_opt_depth;
+ LLColor3 haze_sca_opt_depth;
+ LLColor3 air_transp;
+
for (S32 s = 0; s < NO_STEPS; ++s)
{
h = calcHeight(cur_pos);
step *= e_pow_k;
- LLColor3 air_sca_opt_depth;
LLHaze::calcAirSca(h, air_sca_opt_depth);
air_sca_opt_depth *= step;
- LLColor3 haze_sca_opt_depth;
mHaze.calcSigSca(h, haze_sca_opt_depth);
haze_sca_opt_depth *= step;
@@ -824,7 +827,6 @@ void LLVOSky::calcSkyColorInDir(LLColor3& res, LLColor3& transp, const LLVector3
if (calcHitsEarth(cur_pos, tosun) < 0) // calculates amount of in-scattered light from the sun
{
//visibility check is too expensive
- LLColor3 air_transp;
mTransp.calcTransp(calcUpVec(cur_pos) * tosun, h, air_transp);
air_transp *= transp;
res += air_sca_opt_depth * air_transp;
diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h
index 0ded91bb80..5697e721ff 100644
--- a/indra/newview/llvosky.h
+++ b/indra/newview/llvosky.h
@@ -42,19 +42,12 @@ const F32 INV_NO_STEPS = 1.f/NO_STEPS;
// constants used in calculation of scattering coeff of clear air
const F32 sigma = 0.035f;
-const F32 fsigma = (6+3*sigma)/(6.f-7.f*sigma);
+const F32 fsigma = (6.f + 3.f * sigma) / (6.f-7.f*sigma);
const F64 Ndens = 2.55e25;
const F64 Ndens2 = Ndens*Ndens;
-// !!! *FIX: This #define should be in llcommon somewhere...
-// We should not be #defining anything with leading underscores and
-// much less double leading underscores since that is always vendor
-// specific. Change this to something like LL_FORCE_INLINE.
-#ifdef __GNUC__
-#define __forceinline inline __attribute__((always_inline))
-#endif
-__forceinline LLColor3 color_div(const LLColor3 &col1, const LLColor3 &col2)
+LL_FORCE_INLINE LLColor3 color_div(const LLColor3 &col1, const LLColor3 &col2)
{
return LLColor3(
col1.mV[0] / col2.mV[0],
@@ -121,7 +114,7 @@ private:
public:
static F32 getInterpVal() { return sInterpVal; }
static void setInterpVal(const F32 v) { sInterpVal = v; }
- static BOOL doInterpolate() { return sInterpVal > 0.001; }
+ static BOOL doInterpolate() { return sInterpVal > 0.001f; }
void bindTexture(BOOL curr = TRUE);
@@ -292,7 +285,7 @@ public:
};
-__forceinline LLColor3 refr_ind_calc(const LLColor3 &wave_length)
+LL_FORCE_INLINE LLColor3 refr_ind_calc(const LLColor3 &wave_length)
{
LLColor3 refr_ind;
for (S32 i = 0; i < 3; ++i)
@@ -306,7 +299,7 @@ __forceinline LLColor3 refr_ind_calc(const LLColor3 &wave_length)
}
-__forceinline LLColor3 calc_air_sca_sea_level()
+LL_FORCE_INLINE LLColor3 calc_air_sca_sea_level()
{
const static LLColor3 WAVE_LEN(675, 520, 445);
const static LLColor3 refr_ind = refr_ind_calc(WAVE_LEN);
diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp
index 759493504e..e524cc32fc 100644
--- a/indra/newview/llvosurfacepatch.cpp
+++ b/indra/newview/llvosurfacepatch.cpp
@@ -69,21 +69,21 @@ public:
//============================================================================
LLVOSurfacePatch::LLVOSurfacePatch(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
-: LLStaticViewerObject(id, LL_VO_SURFACE_PATCH, regionp)
+ : LLStaticViewerObject(id, LL_VO_SURFACE_PATCH, regionp),
+ mDirtiedPatch(FALSE),
+ mPool(NULL),
+ mBaseComp(0),
+ mPatchp(NULL),
+ mDirtyTexture(FALSE),
+ mDirtyTerrain(FALSE),
+ mLastNorthStride(0),
+ mLastEastStride(0),
+ mLastStride(0),
+ mLastLength(0)
{
// Terrain must draw during selection passes so it can block objects behind it.
mbCanSelect = TRUE;
-
- mBaseComp = 0;
setScale(LLVector3(16.f, 16.f, 16.f)); // Hack for setting scale for bounding boxes/visibility.
- mPool = NULL;
- mDirtiedPatch = FALSE;
- mLastStride = 0;
- mLastNorthStride = 0;
- mLastEastStride = 0;
- mLastLength = 0;
-
- mDirtyTerrain = TRUE;
}
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index a42d447d5f..1090bf4210 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -257,60 +257,41 @@ void LLVOVolume::animateTextures()
for (S32 i = start; i <= end; i++)
{
- LLQuaternion quat;
- LLVector3 scale(1,1,1);
-
LLFace* facep = mDrawable->getFace(i);
const LLTextureEntry* te = facep->getTextureEntry();
- LLMatrix4& tex_mat = facep->mTextureMatrix;
if (!te)
{
continue;
}
+
if (!(result & LLViewerTextureAnim::ROTATE))
{
te->getRotation(&rot);
}
-
- {
- F32 axis = -1;
- F32 s,t;
- te->getScale(&s,&t);
- if (s < 0)
- {
- axis = -axis;
- }
- if (t < 0)
- {
- axis = -axis;
- }
- quat.setQuat(rot, 0, 0, axis);
- }
-
if (!(result & LLViewerTextureAnim::TRANSLATE))
{
te->getOffset(&off_s,&off_t);
}
+ if (!(result & LLViewerTextureAnim::SCALE))
+ {
+ te->getScale(&scale_s, &scale_t);
+ }
+ LLVector3 scale(scale_s, scale_t, 1.f);
LLVector3 trans(off_s+0.5f, off_t+0.5f, 0.f);
-
+ LLQuaternion quat;
+ quat.setQuat(rot, 0, 0, -1.f);
+
+ LLMatrix4& tex_mat = facep->mTextureMatrix;
tex_mat.identity();
tex_mat.translate(LLVector3(-0.5f, -0.5f, 0.f));
tex_mat.rotate(quat);
- if (!(result & LLViewerTextureAnim::SCALE))
- {
- te->getScale(&scale_s, &scale_t);
- }
-
- {
- scale.setVec(scale_s, scale_t, 1.f);
- LLMatrix4 mat;
- mat.initAll(scale, LLQuaternion(), LLVector3());
- tex_mat *= mat;
- }
-
+ LLMatrix4 mat;
+ mat.initAll(scale, LLQuaternion(), LLVector3());
+ tex_mat *= mat;
+
tex_mat.translate(trans);
}
}
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 44ebb2503b..43c587ed92 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -181,6 +181,8 @@ LLPipeline::LLPipeline() :
void LLPipeline::init()
{
LLMemType mt(LLMemType::MTYPE_PIPELINE);
+
+ mInitialized = TRUE;
stop_glerror();
@@ -1466,7 +1468,7 @@ void renderScriptedBeacons(LLDrawable* drawablep)
&& !vobj->getParent()
&& vobj->flagScripted())
{
- gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 0.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f));
+ gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 0.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth"));
}
}
@@ -1478,7 +1480,7 @@ void renderPhysicalBeacons(LLDrawable* drawablep)
&& !vobj->getParent()
&& vobj->usePhysics())
{
- gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(0.f, 1.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f));
+ gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(0.f, 1.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth"));
}
}
@@ -1490,7 +1492,7 @@ void renderParticleBeacons(LLDrawable* drawablep)
&& vobj->isParticleSource())
{
LLColor4 light_blue(0.5f, 0.5f, 1.f, 0.5f);
- gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", light_blue, LLColor4(1.f, 1.f, 1.f, 0.5f));
+ gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", light_blue, LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth"));
}
}
@@ -1711,7 +1713,7 @@ void LLPipeline::postSort(LLCamera& camera)
LLVector3d pos_global = sourcep->getPositionGlobal();
LLVector3 pos = gAgent.getPosAgentFromGlobal(pos_global);
//pos += LLVector3(0.f, 0.f, 0.2f);
- gObjectList.addDebugBeacon(pos, "", LLColor4(1.f, 1.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f));
+ gObjectList.addDebugBeacon(pos, "", LLColor4(1.f, 1.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), gSavedSettings.getS32("DebugBeaconLineWidth"));
}
}
@@ -1976,6 +1978,7 @@ void LLPipeline::renderGeom(LLCamera& camera)
}
poolp->endRenderPass(i);
#ifndef LL_RELEASE_FOR_DOWNLOAD
+#if LL_DEBUG_GL
GLint depth;
glGetIntegerv(GL_MODELVIEW_STACK_DEPTH, &depth);
if (depth > 3)
@@ -1986,6 +1989,7 @@ void LLPipeline::renderGeom(LLCamera& camera)
LLGLState::checkTextureChannels();
LLGLState::checkClientArrays();
#endif
+#endif
}
}
else
@@ -3874,14 +3878,14 @@ void LLPipeline::bindScreenToTexture()
{
LLGLEnable gl_texture_2d(GL_TEXTURE_2D);
+ GLint* viewport = (GLint*) gGLViewport;
+ GLuint resX = nhpo2(viewport[2]);
+ GLuint resY = nhpo2(viewport[3]);
+
if (mScreenTex == 0)
{
glGenTextures(1, &mScreenTex);
glBindTexture(GL_TEXTURE_2D, mScreenTex);
- GLint viewport[4];
- glGetIntegerv(GL_VIEWPORT, viewport);
- GLuint resX = nhpo2(viewport[2]);
- GLuint resY = nhpo2(viewport[3]);
gImageList.updateMaxResidentTexMem(-1, resX*resY*3);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, resX, resY, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
@@ -3892,11 +3896,6 @@ void LLPipeline::bindScreenToTexture()
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
- GLint viewport[4];
- glGetIntegerv(GL_VIEWPORT, viewport);
- GLuint resX = nhpo2(viewport[2]);
- GLuint resY = nhpo2(viewport[3]);
-
glBindTexture(GL_TEXTURE_2D, mScreenTex);
GLint cResX;
GLint cResY;
@@ -4026,5 +4025,4 @@ void LLPipeline::renderBloom(GLuint source, GLuint dest, GLuint buffer, U32 res,
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
-}
-
+} \ No newline at end of file
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 5baf01de51..f20731c749 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -364,6 +364,7 @@ public:
void clearRenderMap();
+ BOOL mInitialized;
BOOL mVertexShadersEnabled;
S32 mVertexShadersLoaded; // 0 = no, 1 = yes, -1 = failed