diff options
| author | Josh Bell <josh@lindenlab.com> | 2007-04-11 17:54:18 +0000 | 
|---|---|---|
| committer | Josh Bell <josh@lindenlab.com> | 2007-04-11 17:54:18 +0000 | 
| commit | 0277259455c4354f81ea8a24c8ab93f27567bc6f (patch) | |
| tree | f1411dab563dcf697f794e9e8a592a6d3e5c4d2d | |
| parent | 568397bbcc4fca307ebc010ec7f815422b9ba80a (diff) | |
svn merge -r 59968:60342 svn+ssh://svn.lindenlab.com/svn/linden/branches/maintenance --> release
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 ¢er,  // 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 | 
