diff options
Diffstat (limited to 'indra')
109 files changed, 1281 insertions, 492 deletions
diff --git a/indra/llcharacter/lljoint.cpp b/indra/llcharacter/lljoint.cpp index 6f22a7c6b7..5bee4da7c0 100755 --- a/indra/llcharacter/lljoint.cpp +++ b/indra/llcharacter/lljoint.cpp @@ -361,7 +361,6 @@ void LLJoint::removeAttachmentPosOverride( const LLUUID& mesh_id, const std::str  		}  		updatePos(av_info);  	} -  }  //-------------------------------------------------------------------- diff --git a/indra/llcharacter/lljointstate.h b/indra/llcharacter/lljointstate.h index b9c91f80b5..1ccc6b5093 100755 --- a/indra/llcharacter/lljointstate.h +++ b/indra/llcharacter/lljointstate.h @@ -64,22 +64,18 @@ protected:  public:  	// Constructor  	LLJointState() -	{ -		mUsage = 0; -		mJoint = NULL; -		mUsage = 0; -		mWeight = 0.f; -		mPriority = LLJoint::USE_MOTION_PRIORITY; -	} +		: mUsage(0) +		, mJoint(NULL) +		, mWeight(0.f) +		, mPriority(LLJoint::USE_MOTION_PRIORITY) +	{}  	LLJointState(LLJoint* joint) -	{ -		mUsage = 0; -		mJoint = joint; -		mUsage = 0; -		mWeight = 0.f; -		mPriority = LLJoint::USE_MOTION_PRIORITY; -	} +		: mUsage(0) +		, mJoint(joint) +		, mWeight(0.f) +		, mPriority(LLJoint::USE_MOTION_PRIORITY) +	{}  	// joint that this state is applied to  	LLJoint* getJoint()				{ return mJoint; } diff --git a/indra/llcommon/llmd5.cpp b/indra/llcommon/llmd5.cpp index ed80af36d8..f942a976b7 100755 --- a/indra/llcommon/llmd5.cpp +++ b/indra/llcommon/llmd5.cpp @@ -118,6 +118,12 @@ void LLMD5::update (const uint1 *input, const uint4 input_length) {    buffer_space = 64 - buffer_index;  // how much space is left in buffer +  // now, transform each 64-byte piece of the input, bypassing the buffer +  if (input == NULL || input_length == 0){ +	  std::cerr << "LLMD5::update:  Invalid input!" << std::endl; +	  return; +  } +    // Transform as many times as possible.    if (input_length >= buffer_space) { // ie. we have enough to fill the buffer      // fill the rest of the buffer and transform @@ -127,12 +133,6 @@ void LLMD5::update (const uint1 *input, const uint4 input_length) {  		buffer_space);      transform (buffer); -    // now, transform each 64-byte piece of the input, bypassing the buffer -  if (input == NULL || input_length == 0){ -	std::cerr << "LLMD5::update:  Invalid input!" << std::endl; -	return; -  } -      for (input_index = buffer_space; input_index + 63 < input_length;   	 input_index += 64)        transform (input+input_index); diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp index e0b2aa87c2..ae11988df8 100755 --- a/indra/llcommon/llmemory.cpp +++ b/indra/llcommon/llmemory.cpp @@ -63,13 +63,18 @@ LLPrivateMemoryPoolManager::mem_allocation_info_t LLPrivateMemoryPoolManager::sM  void ll_assert_aligned_func(uintptr_t ptr,U32 alignment)  { -#ifdef SHOW_ASSERT -	// Redundant, place to set breakpoints. -	if (ptr%alignment!=0) -	{ -		LL_WARNS() << "alignment check failed" << LL_ENDL; -	} -	llassert(ptr%alignment==0); +#if defined(LL_WINDOWS) && defined(LL_DEBUG_BUFFER_OVERRUN) +	//do not check +	return; +#else +	#ifdef SHOW_ASSERT +		// Redundant, place to set breakpoints. +		if (ptr%alignment!=0) +		{ +			LL_WARNS() << "alignment check failed" << LL_ENDL; +		} +		llassert(ptr%alignment==0); +	#endif  #endif  } @@ -2148,3 +2153,60 @@ void LLPrivateMemoryPoolTester::fragmentationtest()  }  #endif  //-------------------------------------------------------------------- + +#if defined(LL_WINDOWS) && defined(LL_DEBUG_BUFFER_OVERRUN) + +#include <map> + +struct mem_info { +	std::map<void*, void*> memory_info; +	LLMutex mutex; + +	static mem_info& get() { +		static mem_info instance; +		return instance; +	} + +private: +	mem_info(){} +}; + +void* ll_aligned_malloc_fallback( size_t size, int align ) +{ +	SYSTEM_INFO sysinfo; +	GetSystemInfo(&sysinfo); +	 +	unsigned int for_alloc = sysinfo.dwPageSize; +	while(for_alloc < size) for_alloc += sysinfo.dwPageSize; +	 +	void *p = VirtualAlloc(NULL, for_alloc+sysinfo.dwPageSize, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE); +	if(NULL == p) { +		// call debugger +		__asm int 3; +	} +	DWORD old; +	BOOL Res = VirtualProtect((void*)((char*)p + for_alloc), sysinfo.dwPageSize, PAGE_NOACCESS, &old); +	if(FALSE == Res) { +		// call debugger +		__asm int 3; +	} + +	void* ret = (void*)((char*)p + for_alloc-size); +	 +	{ +		LLMutexLock lock(&mem_info::get().mutex); +		mem_info::get().memory_info.insert(std::pair<void*, void*>(ret, p)); +	} +	 + +	return ret; +} + +void ll_aligned_free_fallback( void* ptr ) +{ +	LLMutexLock lock(&mem_info::get().mutex); +	VirtualFree(mem_info::get().memory_info.find(ptr)->second, 0, MEM_RELEASE); +	mem_info::get().memory_info.erase(ptr); +} + +#endif diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h index 7d1d541a4b..c4c9cc0566 100755 --- a/indra/llcommon/llmemory.h +++ b/indra/llcommon/llmemory.h @@ -94,32 +94,44 @@ template <typename T> T* LL_NEXT_ALIGNED_ADDRESS_64(T* address)  #define LL_ALIGN_16(var) LL_ALIGN_PREFIX(16) var LL_ALIGN_POSTFIX(16) - -inline void* ll_aligned_malloc_fallback( size_t size, int align ) -{ -#if defined(LL_WINDOWS) -	return _aligned_malloc(size, align); +//------------------------------------------------------------------------------------------------ +//------------------------------------------------------------------------------------------------ +	// for enable buffer overrun detection predefine LL_DEBUG_BUFFER_OVERRUN in current library +	// change preprocessro code to: #if 1 && defined(LL_WINDOWS) + +#if 0 && defined(LL_WINDOWS) +	void* ll_aligned_malloc_fallback( size_t size, int align ); +	void ll_aligned_free_fallback( void* ptr ); +//------------------------------------------------------------------------------------------------  #else -	void* mem = malloc( size + (align - 1) + sizeof(void*) ); -	char* aligned = ((char*)mem) + sizeof(void*); -	aligned += align - ((uintptr_t)aligned & (align - 1)); - -	((void**)aligned)[-1] = mem; -	return aligned; -#endif -} +	inline void* ll_aligned_malloc_fallback( size_t size, int align ) +	{ +	#if defined(LL_WINDOWS) +		return _aligned_malloc(size, align); +	#else +		void* mem = malloc( size + (align - 1) + sizeof(void*) ); +		char* aligned = ((char*)mem) + sizeof(void*); +		aligned += align - ((uintptr_t)aligned & (align - 1)); + +		((void**)aligned)[-1] = mem; +		return aligned; +	#endif +	} -inline void ll_aligned_free_fallback( void* ptr ) -{ -#if defined(LL_WINDOWS) -	_aligned_free(ptr); -#else -	if (ptr) +	inline void ll_aligned_free_fallback( void* ptr )  	{ -		free( ((void**)ptr)[-1] ); +	#if defined(LL_WINDOWS) +		_aligned_free(ptr); +	#else +		if (ptr) +		{ +			free( ((void**)ptr)[-1] ); +		} +	#endif  	}  #endif -} +//------------------------------------------------------------------------------------------------ +//------------------------------------------------------------------------------------------------  #if !LL_USE_TCMALLOC  inline void* ll_aligned_malloc_16(size_t size) // returned hunk MUST be freed with ll_aligned_free_16(). diff --git a/indra/llcommon/llstacktrace.cpp b/indra/llcommon/llstacktrace.cpp index e0e9056380..bbf0e1e141 100755 --- a/indra/llcommon/llstacktrace.cpp +++ b/indra/llcommon/llstacktrace.cpp @@ -125,6 +125,30 @@ bool ll_get_stack_trace(std::vector<std::string>& lines)  	return false;  } +void ll_get_stack_trace_internal(std::vector<std::string>& lines) +{ +	const S32 MAX_STACK_DEPTH = 100; +	const S32 STRING_NAME_LENGTH = 256; + +	HANDLE process = GetCurrentProcess(); +	SymInitialize( process, NULL, TRUE ); + +	void *stack[MAX_STACK_DEPTH]; + +	unsigned short frames = RtlCaptureStackBackTrace_fn( 0, MAX_STACK_DEPTH, stack, NULL ); +	SYMBOL_INFO *symbol = (SYMBOL_INFO*)calloc(sizeof(SYMBOL_INFO) + STRING_NAME_LENGTH * sizeof(char), 1); +	symbol->MaxNameLen = STRING_NAME_LENGTH-1; +	symbol->SizeOfStruct = sizeof(SYMBOL_INFO); + +	for(unsigned int i = 0; i < frames; i++)  +	{ +		SymFromAddr(process, (DWORD64)(stack[i]), 0, symbol); +		lines.push_back(symbol->Name); +	} + +	free( symbol ); +} +  #else  bool ll_get_stack_trace(std::vector<std::string>& lines) @@ -132,5 +156,10 @@ bool ll_get_stack_trace(std::vector<std::string>& lines)  	return false;  } +void ll_get_stack_trace_internal(std::vector<std::string>& lines) +{ + +} +  #endif diff --git a/indra/llcommon/llstacktrace.h b/indra/llcommon/llstacktrace.h index ca72c64c5d..335765386a 100755 --- a/indra/llcommon/llstacktrace.h +++ b/indra/llcommon/llstacktrace.h @@ -33,6 +33,7 @@  #include <string>  LL_COMMON_API bool ll_get_stack_trace(std::vector<std::string>& lines); +LL_COMMON_API void ll_get_stack_trace_internal(std::vector<std::string>& lines);  #endif diff --git a/indra/llcommon/lluriparser.cpp b/indra/llcommon/lluriparser.cpp index ef4481d32f..d07288f123 100644 --- a/indra/llcommon/lluriparser.cpp +++ b/indra/llcommon/lluriparser.cpp @@ -175,29 +175,58 @@ S32 LLUriParser::normalize()  				if (!mRes)  				{  					mNormalizedUri = &label_buf[mTmpScheme ? 7 : 0]; +					mTmpScheme = false;  				}  			}  		}  	} +	if(mTmpScheme) +	{ +		mNormalizedUri = mNormalizedUri.substr(7); +		mTmpScheme = false; +	} +  	return mRes;  }  void LLUriParser::glue(std::string& uri) const  { +	std::string first_part; +	glueFirst(first_part); + +	std::string second_part; +	glueSecond(second_part); + +	uri = first_part + second_part; +} + +void LLUriParser::glueFirst(std::string& uri) const +{  	if (mScheme.size())  	{  		uri = mScheme;  		uri += "://";  	} +	else +	{ +		uri.clear(); +	}  	uri += mHost; +} +void LLUriParser::glueSecond(std::string& uri) const +{  	if (mPort.size())  	{ -		uri += ':'; +		uri = ':';  		uri += mPort;  	} +	else +	{ +		uri.clear(); +	}  	uri += mPath; diff --git a/indra/llcommon/lluriparser.h b/indra/llcommon/lluriparser.h index 719f916837..e987bae924 100644 --- a/indra/llcommon/lluriparser.h +++ b/indra/llcommon/lluriparser.h @@ -60,6 +60,8 @@ public:  	void extractParts();  	void glue(std::string& uri) const; +	void glueFirst(std::string& uri) const; +	void glueSecond(std::string& uri) const;  	bool test() const;  	S32 normalize(); diff --git a/indra/llmath/llmath.h b/indra/llmath/llmath.h index b4ac1dec73..7f39e58f71 100755 --- a/indra/llmath/llmath.h +++ b/indra/llmath/llmath.h @@ -559,6 +559,7 @@ inline void ll_remove_outliers(std::vector<VEC_TYPE>& data, F32 k)  inline void	ll_nn2d_interpolation(const U8 *const src, U32 srcW, U32 srcH, U8 srcCh, U8 *const dst, U32 dstW, U32 dstH, U8 dstCh)  { +	llassert(NULL != src && NULL != dst);  	llassert(srcCh>=dstCh);  	S32 tmp_x = 0, tmp_y = 0, tmp_x1 = 0, tmp_x2 = 0; diff --git a/indra/llmath/llsphere.cpp b/indra/llmath/llsphere.cpp index 740047b93a..a8d6200488 100755 --- a/indra/llmath/llsphere.cpp +++ b/indra/llmath/llsphere.cpp @@ -248,8 +248,8 @@ LLSphere LLSphere::getBoundingSphere(const std::vector<LLSphere>& sphere_list)  		// compute the starting step-size  		F32 minimum_radius = 0.5f * llmin(diagonal.mV[VX], llmin(diagonal.mV[VY], diagonal.mV[VZ]));  		F32 step_length = bounding_radius - minimum_radius; -		S32 step_count = 0; -		S32 max_step_count = 12; +		//S32 step_count = 0; +		//S32 max_step_count = 12;  		F32 half_milimeter = 0.0005f;  		// wander the center around in search of tighter solutions @@ -258,7 +258,7 @@ LLSphere LLSphere::getBoundingSphere(const std::vector<LLSphere>& sphere_list)  		S32 last_dz = 2;  		while (step_length > half_milimeter -				&& step_count < max_step_count) +				/*&& step_count < max_step_count*/)  		{  			// the algorithm for testing the maximum radius could be expensive enough  			// that it makes sense to NOT duplicate testing when possible, so we keep diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index d9a68cb577..adf6e790d3 100755 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -2685,6 +2685,17 @@ void LLVolume::setMeshAssetLoaded(BOOL loaded)  	mIsMeshAssetLoaded = loaded;  } +void LLVolume::copyFacesTo(std::vector<LLVolumeFace> &faces) const  +{ +	faces = mVolumeFaces; +} + +void LLVolume::copyFacesFrom(const std::vector<LLVolumeFace> &faces) +{ +	mVolumeFaces = faces; +	mSculptLevel = 0; +} +  void LLVolume::copyVolumeFaces(const LLVolume* volume)  {  	mVolumeFaces = volume->mVolumeFaces; @@ -5970,7 +5981,10 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)  	}  	else  	{ //degenerate, make up a value -		normal.set(0,0,1); +		if(normal.getF32ptr()[2] >= 0) +			normal.set(0.f,0.f,1.f); +		else +			normal.set(0.f,0.f,-1.f);  	}  	llassert(llfinite(normal.getF32ptr()[0])); @@ -6284,6 +6298,8 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)  	num_vertices = mNumS*mNumT;  	num_indices = (mNumS-1)*(mNumT-1)*6; +	partial_build = (num_vertices > mNumVertices || num_indices > mNumIndices) ? FALSE : partial_build; +  	if (!partial_build)  	{  		resizeVertices(num_vertices); diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h index 2f38ae7203..c8476f6897 100755 --- a/indra/llmath/llvolume.h +++ b/indra/llmath/llvolume.h @@ -993,6 +993,7 @@ public:  	void resizePath(S32 length);  	const LLAlignedArray<LLVector4a,64>&	getMesh() const				{ return mMesh; }  	const LLVector4a& getMeshPt(const U32 i) const			{ return mMesh[i]; } +	  	void setDirty() { mPathp->setDirty(); mProfilep->setDirty(); } @@ -1045,6 +1046,8 @@ public:  	void sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, S32 sculpt_level);  	void copyVolumeFaces(const LLVolume* volume); +	void copyFacesTo(std::vector<LLVolumeFace> &faces) const; +	void copyFacesFrom(const std::vector<LLVolumeFace> &faces);  	void cacheOptimize();  private: diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index aa8dd7697c..e0294cfd6a 100755 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -1681,11 +1681,11 @@ LLSD LLModel::writeModel(  						}  					} -					F32* src_tc = (F32*) face.mTexCoords[j].mV; -  					//texcoord  					if (face.mTexCoords)  					{ +						F32* src_tc = (F32*) face.mTexCoords[j].mV; +  						for (U32 k = 0; k < 2; ++k)  						{ //for each component  							//convert to 16-bit normalized @@ -2012,7 +2012,7 @@ bool LLModel::loadModel(std::istream& is)  		}  	} -	std::string nm[] =  +	static const std::string nm[] =   	{  		"lowest_lod",  		"low_lod", diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp index a505ea04a7..aa44dc67d5 100755 --- a/indra/llprimitive/llprimitive.cpp +++ b/indra/llprimitive/llprimitive.cpp @@ -324,6 +324,11 @@ S32 LLPrimitive::setTEMaterialParams(const U8 index, const LLMaterialPtr pMateri  	return mTextureList.setMaterialParams(index, pMaterialParams);  } +LLMaterialPtr LLPrimitive::getTEMaterialParams(const U8 index) +{ +	return mTextureList.getMaterialParams(index); +} +  //===============================================================  S32  LLPrimitive::setTEBumpShinyFullbright(const U8 index, const U8 bump)  { diff --git a/indra/llprimitive/llprimitive.h b/indra/llprimitive/llprimitive.h index cdb3f273c2..1bf83e36b4 100755 --- a/indra/llprimitive/llprimitive.h +++ b/indra/llprimitive/llprimitive.h @@ -389,6 +389,8 @@ public:  	virtual BOOL setMaterial(const U8 material); // returns TRUE if material changed  	virtual void setTESelected(const U8 te, bool sel); +	LLMaterialPtr getTEMaterialParams(const U8 index); +  	void copyTEs(const LLPrimitive *primitive);  	S32 packTEField(U8 *cur_ptr, U8 *data_ptr, U8 data_size, U8 last_face_index, EMsgVariableType type) const;  	S32 unpackTEField(U8 *cur_ptr, U8 *buffer_end, U8 *data_ptr, U8 data_size, U8 face_count, EMsgVariableType type); diff --git a/indra/llprimitive/llprimtexturelist.cpp b/indra/llprimitive/llprimtexturelist.cpp index dfae9699ec..f4f08248b8 100755 --- a/indra/llprimitive/llprimtexturelist.cpp +++ b/indra/llprimitive/llprimtexturelist.cpp @@ -377,6 +377,16 @@ S32 LLPrimTextureList::setMaterialParams(const U8 index, const LLMaterialPtr pMa  	return TEM_CHANGE_NONE;  } +LLMaterialPtr LLPrimTextureList::getMaterialParams(const U8 index) +{ +	if (index < mEntryList.size()) +	{ +		return mEntryList[index]->getMaterialParams(); +	} +	 +	return LLMaterialPtr(); +} +  S32 LLPrimTextureList::size() const  {  	return mEntryList.size(); diff --git a/indra/llprimitive/llprimtexturelist.h b/indra/llprimitive/llprimtexturelist.h index d7fabbbb79..49c636e40f 100755 --- a/indra/llprimitive/llprimtexturelist.h +++ b/indra/llprimitive/llprimtexturelist.h @@ -107,6 +107,8 @@ public:  	S32 setMaterialID(const U8 index, const LLMaterialID& pMaterialID);  	S32 setMaterialParams(const U8 index, const LLMaterialPtr pMaterialParams); +	LLMaterialPtr getMaterialParams(const U8 index); +  	S32 size() const;  //	void forceResize(S32 new_size); diff --git a/indra/llprimitive/object_flags.h b/indra/llprimitive/object_flags.h index 31dbd15ae0..88eaeb034a 100755 --- a/indra/llprimitive/object_flags.h +++ b/indra/llprimitive/object_flags.h @@ -69,6 +69,7 @@ const U32   FLAGS_TEMPORARY_ON_REZ     = (1U << 29);  //const U32 FLAGS_UNUSED_007           = (1U << 31); // was FLAGS_ZLIB_COMPRESSED  const U32   FLAGS_LOCAL                = FLAGS_ANIM_SOURCE | FLAGS_CAMERA_SOURCE; +const U32   FLAGS_WORLD                = FLAGS_USE_PHYSICS | FLAGS_PHANTOM | FLAGS_TEMPORARY_ON_REZ;  typedef enum e_havok_joint_type  { diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index 0af402efea..1ca6e99ecf 100755 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -53,7 +53,7 @@ bool LLRender::sGLCoreProfile = false;  static const U32 LL_NUM_TEXTURE_LAYERS = 32;   static const U32 LL_NUM_LIGHT_UNITS = 8; -static GLenum sGLTextureType[] = +static const GLenum sGLTextureType[] =  {  	GL_TEXTURE_2D,  	GL_TEXTURE_RECTANGLE_ARB, @@ -61,14 +61,14 @@ static GLenum sGLTextureType[] =  	GL_TEXTURE_2D_MULTISAMPLE  }; -static GLint sGLAddressMode[] = +static const GLint sGLAddressMode[] =  {	  	GL_REPEAT,  	GL_MIRRORED_REPEAT,  	GL_CLAMP_TO_EDGE  }; -static GLenum sGLCompareFunc[] = +static const GLenum sGLCompareFunc[] =  {  	GL_NEVER,  	GL_ALWAYS, @@ -82,7 +82,7 @@ static GLenum sGLCompareFunc[] =  const U32 immediate_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_TEXCOORD0; -static GLenum sGLBlendFactor[] = +static const GLenum sGLBlendFactor[] =  {  	GL_ONE,  	GL_ZERO, @@ -99,12 +99,12 @@ static GLenum sGLBlendFactor[] =  };  LLTexUnit::LLTexUnit(S32 index) -: mCurrTexType(TT_NONE), mCurrBlendType(TB_MULT),  -mCurrColorOp(TBO_MULT), mCurrAlphaOp(TBO_MULT), -mCurrColorSrc1(TBS_TEX_COLOR), mCurrColorSrc2(TBS_PREV_COLOR), -mCurrAlphaSrc1(TBS_TEX_ALPHA), mCurrAlphaSrc2(TBS_PREV_ALPHA), -mCurrColorScale(1), mCurrAlphaScale(1), mCurrTexture(0), -mHasMipMaps(false) +	: mCurrTexType(TT_NONE), mCurrBlendType(TB_MULT),  +	mCurrColorOp(TBO_MULT), mCurrAlphaOp(TBO_MULT), +	mCurrColorSrc1(TBS_TEX_COLOR), mCurrColorSrc2(TBS_PREV_COLOR), +	mCurrAlphaSrc1(TBS_TEX_ALPHA), mCurrAlphaSrc2(TBS_PREV_ALPHA), +	mCurrColorScale(1), mCurrAlphaScale(1), mCurrTexture(0), +	mHasMipMaps(false)  {  	llassert_always(index < (S32)LL_NUM_TEXTURE_LAYERS);  	mIndex = index; @@ -1189,7 +1189,7 @@ void LLRender::syncMatrices()  	if (shader)  	{ -		llassert(shader); +		//llassert(shader);  		bool mvp_done = false; @@ -1288,7 +1288,7 @@ void LLRender::syncMatrices()  	}  	else if (!LLGLSLShader::sNoFixedFunction)  	{ -		GLenum mode[] =  +		static const GLenum mode[] =   		{  			GL_MODELVIEW,  			GL_PROJECTION, diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp index 474b545f00..00d553e457 100755 --- a/indra/llui/llfolderview.cpp +++ b/indra/llui/llfolderview.cpp @@ -1611,7 +1611,7 @@ void LLFolderView::update()  	LLFolderViewFilter& filter_object = getFolderViewModel()->getFilter(); -	if (filter_object.isModified() && filter_object.isNotDefault()) +	if (filter_object.isModified() && filter_object.isNotDefault() && mParentPanel.get()->getVisible())  	{  		mNeedsAutoSelect = TRUE;  	} @@ -1653,8 +1653,10 @@ void LLFolderView::update()  		scrollToShowSelection();  	} -	BOOL filter_finished = getViewModelItem()->passedFilter() -						&& mViewModel->contentsReady(); +	BOOL filter_finished = mViewModel->contentsReady() +							&& (getViewModelItem()->passedFilter() +								|| ( getViewModelItem()->getLastFilterGeneration() >= filter_object.getFirstSuccessGeneration() +									&& !filter_object.isModified()));  	if (filter_finished   		|| gFocusMgr.childHasKeyboardFocus(mParentPanel.get())  		|| gFocusMgr.childHasMouseCapture(mParentPanel.get())) diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 5f72ee3ac6..c59a4fb860 100755 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -1825,6 +1825,7 @@ BOOL LLScrollListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)  				return TRUE;  			}  		} +		return LLUICtrl::handleRightMouseDown(x, y, mask);  	}  	return FALSE;  } diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 09f923e74f..310323445b 100755 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -2063,8 +2063,17 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para  			LLTextUtil::processUrlMatch(&match, this, isContentTrusted() || match.isTrusted());  			// output the styled Url -			//appendAndHighlightTextImpl(label, part, link_params, match.underlineOnHoverOnly());  			appendAndHighlightTextImpl(match.getLabel(), part, link_params, match.underlineOnHoverOnly()); + +			// show query part of url with gray color if enabled in global settings in "HTTPNoProtocolShowGreyQuery" +			// and only for LLUrlEntryHTTP and LLUrlEntryHTTPNoProtocol url entries +			std::string label = match.getQuery(); +			if (label.size()) +			{ +				link_params.color = LLColor4::grey; +				link_params.readonly_color = LLColor4::grey; +				appendAndHighlightTextImpl(label, part, link_params, match.underlineOnHoverOnly()); +			}  			// set the tooltip for the Url label  			if (! match.getTooltip().empty()) diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index c06d6144b9..ac023e664d 100755 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -48,7 +48,9 @@ std::string localize_slapp_label(const std::string& url, const std::string& full  LLUrlEntryBase::LLUrlEntryBase() -{} +{ +	mGreyQuery = LLUI::sSettingGroups["config"]->getBOOL("HTTPNoProtocolShowGreyQuery"); +}  LLUrlEntryBase::~LLUrlEntryBase()  { @@ -187,6 +189,33 @@ bool LLUrlEntryBase::isWikiLinkCorrect(std::string url)  	return (LLUrlRegistry::instance().hasUrl(label)) ? false : true;  } +std::string LLUrlEntryBase::urlToLabelWithGreyQuery(const std::string &url) const +{ +	LLUriParser up(unescapeUrl(url)); +	up.normalize(); + +	std::string label; +	up.extractParts(); +	up.glueFirst(label); + +	return label; +} + +std::string LLUrlEntryBase::urlToGreyQuery(const std::string &url) const +{ +	LLUriParser up(unescapeUrl(url)); + +	std::string query; +	if (mGreyQuery) +	{ +		up.extractParts(); +		up.glueSecond(query); +	} + +	return query; +} + +  static std::string getStringAfterToken(const std::string str, const std::string token)  {  	size_t pos = str.find(token); @@ -203,6 +232,7 @@ static std::string getStringAfterToken(const std::string str, const std::string  // LLUrlEntryHTTP Describes generic http: and https: Urls  //  LLUrlEntryHTTP::LLUrlEntryHTTP() +	: LLUrlEntryBase()  {  	mPattern = boost::regex("https?://([-\\w\\.]+)+(:\\d+)?(:\\w+)?(@\\d+)?(@\\w+)?/?\\S*",  							boost::regex::perl|boost::regex::icase); @@ -212,6 +242,25 @@ LLUrlEntryHTTP::LLUrlEntryHTTP()  std::string LLUrlEntryHTTP::getLabel(const std::string &url, const LLUrlLabelCallback &cb)  { +	return urlToLabelWithGreyQuery(url); +} + +std::string LLUrlEntryHTTP::getQuery(const std::string &url) const +{ +	return urlToGreyQuery(url); +} + +std::string LLUrlEntryHTTP::getUrl(const std::string &string) const +{ +	if (string.find("://") == std::string::npos) +	{ +		return "http://" + escapeUrl(string); +	} +	return escapeUrl(string); +} + +std::string LLUrlEntryHTTP::getTooltip(const std::string &url) const +{  	return unescapeUrl(url);  } @@ -247,6 +296,7 @@ std::string LLUrlEntryHTTPLabel::getUrl(const std::string &string) const  // LLUrlEntryHTTPNoProtocol Describes generic Urls like www.google.com  //  LLUrlEntryHTTPNoProtocol::LLUrlEntryHTTPNoProtocol() +	: LLUrlEntryBase()  {  	mPattern = boost::regex("("  				"\\bwww\\.\\S+\\.\\S+" // i.e. www.FOO.BAR @@ -260,7 +310,12 @@ LLUrlEntryHTTPNoProtocol::LLUrlEntryHTTPNoProtocol()  std::string LLUrlEntryHTTPNoProtocol::getLabel(const std::string &url, const LLUrlLabelCallback &cb)  { -	return unescapeUrl(url); +	return urlToLabelWithGreyQuery(url); +} + +std::string LLUrlEntryHTTPNoProtocol::getQuery(const std::string &url) const +{ +	return urlToGreyQuery(url);  }  std::string LLUrlEntryHTTPNoProtocol::getUrl(const std::string &string) const @@ -272,6 +327,11 @@ std::string LLUrlEntryHTTPNoProtocol::getUrl(const std::string &string) const  	return escapeUrl(string);  } +std::string LLUrlEntryHTTPNoProtocol::getTooltip(const std::string &url) const +{ +	return unescapeUrl(url); +} +  //  // LLUrlEntrySLURL Describes generic http: and https: Urls  // @@ -345,29 +405,53 @@ std::string LLUrlEntrySLURL::getLocation(const std::string &url) const  }  // -// LLUrlEntrySeconlifeURLs Describes *secondlife.com and *lindenlab.com urls to substitute icon 'hand.png' before link +// LLUrlEntrySeconlifeURL Describes *secondlife.com/ and *lindenlab.com/ urls to substitute icon 'hand.png' before link  // -LLUrlEntrySeconlifeURL::LLUrlEntrySeconlifeURL() -{  -	mPattern = boost::regex("\\b(https?://)?([-\\w\\.]*\\.)?(secondlife|lindenlab)\\.com(:\\d{1,5})?(/\\S*)?\\b", +LLUrlEntrySecondlifeURL::LLUrlEntrySecondlifeURL() +{                               +	mPattern = boost::regex("(https?://)?([-\\w\\.]*\\.)?(secondlife|lindenlab)\\.com(:\\d{1,5})?\\/\\S*",  		boost::regex::perl|boost::regex::icase);  	mIcon = "Hand";  	mMenuName = "menu_url_http.xml";  } -std::string LLUrlEntrySeconlifeURL::getLabel(const std::string &url, const LLUrlLabelCallback &cb) +std::string LLUrlEntrySecondlifeURL::getLabel(const std::string &url, const LLUrlLabelCallback &cb)  {  	LLUriParser up(url);  	up.extractParts(); -	return up.host(); + +	std::string label; +	up.glueFirst(label); +	return label;  } -std::string LLUrlEntrySeconlifeURL::getTooltip(const std::string &url) const +std::string LLUrlEntrySecondlifeURL::getTooltip(const std::string &url) const  {  	return url;  } +std::string LLUrlEntrySecondlifeURL::getUrl(const std::string &string) const +{ +	if (string.find("://") == std::string::npos) +	{ +		return "http://" + escapeUrl(string); +	} +	return escapeUrl(string); +} + +// +// LLUrlEntrySimpleSecondlifeURL Describes *secondlife.com and *lindenlab.com urls to substitute icon 'hand.png' before link +// +LLUrlEntrySimpleSecondlifeURL::LLUrlEntrySimpleSecondlifeURL() +  { +	mPattern = boost::regex("(https?://)?([-\\w\\.]*\\.)?(secondlife|lindenlab)\\.com(?!\\S)", +		boost::regex::perl|boost::regex::icase); + +	mIcon = "Hand"; +	mMenuName = "menu_url_http.xml"; +} +  //  // LLUrlEntryAgent Describes a Second Life agent Url, e.g.,  // secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 1cb11cdb1c..fd18389303 100755 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -78,6 +78,9 @@ public:  	/// Given a matched Url, return a label for the Url  	virtual std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb) { return url; } +	/// Return port, query and fragment parts for the Url +	virtual std::string getQuery(const std::string &url) const { return ""; } +  	/// Return an icon that can be displayed next to Urls of this type  	virtual std::string getIcon(const std::string &url); @@ -111,6 +114,8 @@ protected:  	std::string getLabelFromWikiLink(const std::string &url) const;  	std::string getUrlFromWikiLink(const std::string &string) const;  	void addObserver(const std::string &id, const std::string &url, const LLUrlLabelCallback &cb);  +	std::string urlToLabelWithGreyQuery(const std::string &url) const; +	std::string urlToGreyQuery(const std::string &url) const;  	virtual void callObservers(const std::string &id, const std::string &label, const std::string& icon);  	typedef struct { @@ -123,6 +128,7 @@ protected:  	std::string                                    	mMenuName;  	std::string                                    	mTooltip;  	std::multimap<std::string, LLUrlEntryObserver>	mObservers; +	bool											mGreyQuery;  };  /// @@ -133,6 +139,9 @@ class LLUrlEntryHTTP : public LLUrlEntryBase  public:  	LLUrlEntryHTTP();  	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); +	/*virtual*/ std::string getQuery(const std::string &url) const; +	/*virtual*/ std::string getUrl(const std::string &string) const; +	/*virtual*/ std::string getTooltip(const std::string &url) const;  };  /// @@ -155,7 +164,9 @@ class LLUrlEntryHTTPNoProtocol : public LLUrlEntryBase  public:  	LLUrlEntryHTTPNoProtocol();  	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); +	/*virtual*/ std::string getQuery(const std::string &url) const;  	/*virtual*/ std::string getUrl(const std::string &string) const; +	/*virtual*/ std::string getTooltip(const std::string &url) const;  };  /// @@ -172,16 +183,23 @@ public:  ///  /// LLUrlEntrySeconlifeURLs Describes *secondlife.com and *lindenlab.com Urls  /// -class LLUrlEntrySeconlifeURL : public LLUrlEntryBase +class LLUrlEntrySecondlifeURL : public LLUrlEntryBase  {  public: -	LLUrlEntrySeconlifeURL(); +	LLUrlEntrySecondlifeURL();  	bool isTrusted() const { return true; }  	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);  	/*virtual*/ std::string getTooltip(const std::string &url) const; +	/*virtual*/ std::string getUrl(const std::string &string) const; +}; -private: -	std::string mLabel; +/// +/// LLUrlEntrySeconlifeURLs Describes *secondlife.com and *lindenlab.com Urls +/// +class LLUrlEntrySimpleSecondlifeURL : public LLUrlEntrySecondlifeURL +{ +public: +	LLUrlEntrySimpleSecondlifeURL();  };  /// diff --git a/indra/llui/llurlmatch.cpp b/indra/llui/llurlmatch.cpp index 016d1ca92d..2f2ac969e1 100755 --- a/indra/llui/llurlmatch.cpp +++ b/indra/llui/llurlmatch.cpp @@ -42,8 +42,8 @@ LLUrlMatch::LLUrlMatch() :  {  } -void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url, -						   const std::string &label, const std::string &tooltip, +void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url, const std::string &label, +						   const std::string& query, const std::string &tooltip,  						   const std::string &icon, const LLStyle::Params& style,  						   const std::string &menu, const std::string &location,  						   const LLUUID& id, bool underline_on_hover_only, bool trusted) @@ -52,6 +52,7 @@ void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url,  	mEnd = end;  	mUrl = url;  	mLabel = label; +	mQuery = query;  	mTooltip = tooltip;  	mIcon = icon;  	mStyle = style; diff --git a/indra/llui/llurlmatch.h b/indra/llui/llurlmatch.h index 9f8960b32f..ff699902ca 100755 --- a/indra/llui/llurlmatch.h +++ b/indra/llui/llurlmatch.h @@ -62,6 +62,9 @@ public:  	/// return a label that can be used for the display of this Url  	std::string getLabel() const { return mLabel; } +	/// return a right part of url which should be drawn in grey +	std::string getQuery() const { return mQuery; } +  	/// return a message that could be displayed in a tooltip or status bar  	std::string getTooltip() const { return mTooltip; } @@ -85,10 +88,10 @@ public:  	/// Change the contents of this match object (used by LLUrlRegistry)  	void setValues(U32 start, U32 end, const std::string &url, const std::string &label, -	               const std::string &tooltip, const std::string &icon, +	               const std::string& query, const std::string &tooltip, const std::string &icon,  				   const LLStyle::Params& style, const std::string &menu,   				   const std::string &location, const LLUUID& id, -				   bool underline_on_hover_only = false, bool trusted = false ); +				   bool underline_on_hover_only = false, bool trusted = false);  	const LLUUID& getID() const { return mID; }  private: @@ -96,6 +99,7 @@ private:  	U32         mEnd;  	std::string mUrl;  	std::string mLabel; +	std::string mQuery;  	std::string mTooltip;  	std::string mIcon;  	std::string mMenuName; diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index 9e8d8d01f1..5918d97be4 100755 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -47,7 +47,8 @@ LLUrlRegistry::LLUrlRegistry()  	registerUrl(new LLUrlEntrySLURL());  	// decorated links for host names like: secondlife.com and lindenlab.com -	registerUrl(new LLUrlEntrySeconlifeURL()); +	registerUrl(new LLUrlEntrySecondlifeURL()); +	registerUrl(new LLUrlEntrySimpleSecondlifeURL());  	registerUrl(new LLUrlEntryHTTP());  	mUrlEntryHTTPLabel = new LLUrlEntryHTTPLabel(); @@ -216,6 +217,7 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL  		match.setValues(match_start, match_end,  						match_entry->getUrl(url),  						match_entry->getLabel(url, cb), +						match_entry->getQuery(url),  						match_entry->getTooltip(url),  						match_entry->getIcon(url),  						match_entry->getStyle(), @@ -252,6 +254,7 @@ bool LLUrlRegistry::findUrl(const LLWString &text, LLUrlMatch &match, const LLUr  		match.setValues(start, end, match.getUrl(),   						match.getLabel(), +						match.getQuery(),  						match.getTooltip(),  						match.getIcon(),  						match.getStyle(), diff --git a/indra/llui/tests/llurlmatch_test.cpp b/indra/llui/tests/llurlmatch_test.cpp index 55c1efefef..843886eb69 100755 --- a/indra/llui/tests/llurlmatch_test.cpp +++ b/indra/llui/tests/llurlmatch_test.cpp @@ -151,7 +151,7 @@ namespace tut  		LLUrlMatch match;  		ensure("empty()", match.empty()); -		match.setValues(0, 1, "http://secondlife.com", "Second Life", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(0, 1, "http://secondlife.com", "", "Second Life", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure("! empty()", ! match.empty());  	} @@ -164,7 +164,7 @@ namespace tut  		LLUrlMatch match;  		ensure_equals("getStart() == 0", match.getStart(), 0); -		match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getStart() == 10", match.getStart(), 10);  	} @@ -177,7 +177,7 @@ namespace tut  		LLUrlMatch match;  		ensure_equals("getEnd() == 0", match.getEnd(), 0); -		match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getEnd() == 20", match.getEnd(), 20);  	} @@ -190,10 +190,10 @@ namespace tut  		LLUrlMatch match;  		ensure_equals("getUrl() == ''", match.getUrl(), ""); -		match.setValues(10, 20, "http://slurl.com/", "", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "http://slurl.com/", "", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getUrl() == 'http://slurl.com/'", match.getUrl(), "http://slurl.com/"); -		match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getUrl() == '' (2)", match.getUrl(), "");  	} @@ -206,10 +206,10 @@ namespace tut  		LLUrlMatch match;  		ensure_equals("getLabel() == ''", match.getLabel(), ""); -		match.setValues(10, 20, "", "Label", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "Label", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getLabel() == 'Label'", match.getLabel(), "Label"); -		match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getLabel() == '' (2)", match.getLabel(), "");  	} @@ -222,10 +222,10 @@ namespace tut  		LLUrlMatch match;  		ensure_equals("getTooltip() == ''", match.getTooltip(), ""); -		match.setValues(10, 20, "", "", "Info", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "Info", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getTooltip() == 'Info'", match.getTooltip(), "Info"); -		match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getTooltip() == '' (2)", match.getTooltip(), "");  	} @@ -238,10 +238,10 @@ namespace tut  		LLUrlMatch match;  		ensure_equals("getIcon() == ''", match.getIcon(), ""); -		match.setValues(10, 20, "", "", "", "Icon", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "Icon", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getIcon() == 'Icon'", match.getIcon(), "Icon"); -		match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure_equals("getIcon() == '' (2)", match.getIcon(), "");  	} @@ -254,10 +254,10 @@ namespace tut  		LLUrlMatch match;  		ensure("getMenuName() empty", match.getMenuName().empty()); -		match.setValues(10, 20, "", "", "", "Icon", LLStyle::Params(), "xui_file.xml", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "Icon", LLStyle::Params(), "xui_file.xml", "", LLUUID::null);  		ensure_equals("getMenuName() == \"xui_file.xml\"", match.getMenuName(), "xui_file.xml"); -		match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure("getMenuName() empty (2)", match.getMenuName().empty());  	} @@ -270,10 +270,10 @@ namespace tut  		LLUrlMatch match;  		ensure("getLocation() empty", match.getLocation().empty()); -		match.setValues(10, 20, "", "", "", "Icon", LLStyle::Params(), "xui_file.xml", "Paris", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "Icon", LLStyle::Params(), "xui_file.xml", "Paris", LLUUID::null);  		ensure_equals("getLocation() == \"Paris\"", match.getLocation(), "Paris"); -		match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); +		match.setValues(10, 20, "", "", "", "", "", LLStyle::Params(), "", "", LLUUID::null);  		ensure("getLocation() empty (2)", match.getLocation().empty());  	}  } diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index 0a30f4c807..0aa1fbe905 100755 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -122,6 +122,7 @@ public:  	virtual void gatherInput() = 0;  	virtual void delayInputProcessing() = 0;  	virtual void swapBuffers() = 0; +	virtual void restoreGLContext() = 0;  	virtual void bringToFront() = 0;  	virtual void focusClient() { };		// this may not have meaning or be required on other platforms, therefore, it's not abstract  	virtual void setOldResize(bool oldresize) { }; diff --git a/indra/llwindow/llwindowheadless.cpp b/indra/llwindow/llwindowheadless.cpp index e6e6bc67ff..b6f67c6107 100755 --- a/indra/llwindow/llwindowheadless.cpp +++ b/indra/llwindow/llwindowheadless.cpp @@ -52,3 +52,6 @@ void LLWindowHeadless::swapBuffers()  {  } +void LLWindowHeadless::restoreGLContext() +{ +} diff --git a/indra/llwindow/llwindowheadless.h b/indra/llwindow/llwindowheadless.h index 1f767f4c97..5975ee3410 100755 --- a/indra/llwindow/llwindowheadless.h +++ b/indra/llwindow/llwindowheadless.h @@ -74,8 +74,10 @@ public:  	/*virtual*/ void gatherInput() {};  	/*virtual*/ void delayInputProcessing() {};  	/*virtual*/ void swapBuffers(); +	/*virtual*/ void restoreGLContext(); -	// handy coordinate space conversion routines +	 +    // handy coordinate space conversion routines  	/*virtual*/ BOOL convertCoords(LLCoordScreen from, LLCoordWindow *to) { return FALSE; };  	/*virtual*/ BOOL convertCoords(LLCoordWindow from, LLCoordScreen *to) { return FALSE; };  	/*virtual*/ BOOL convertCoords(LLCoordWindow from, LLCoordGL *to) { return FALSE; }; diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index d7aa47f378..1f577b117e 100755 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -904,6 +904,11 @@ void LLWindowMacOSX::swapBuffers()  	CGLFlushDrawable(mContext);  } +void LLWindowMacOSX::restoreGLContext() +{ +    CGLSetCurrentContext(mContext); +} +  F32 LLWindowMacOSX::getGamma()  {  	F32 result = 2.2;	// Default to something sane diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index 825fd05c5f..194c9bb27a 100755 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -87,6 +87,8 @@ public:  	/*virtual*/ void gatherInput();  	/*virtual*/ void delayInputProcessing() {};  	/*virtual*/ void swapBuffers(); +	/*virtual*/ void restoreGLContext(); +  	// handy coordinate space conversion routines  	/*virtual*/ BOOL convertCoords(LLCoordScreen from, LLCoordWindow *to); diff --git a/indra/llwindow/llwindowmesaheadless.h b/indra/llwindow/llwindowmesaheadless.h index 8f70aee4f6..00e42240e6 100755 --- a/indra/llwindow/llwindowmesaheadless.h +++ b/indra/llwindow/llwindowmesaheadless.h @@ -77,6 +77,7 @@ public:  	/*virtual*/ void gatherInput() {};  	/*virtual*/ void delayInputProcessing() {};  	/*virtual*/ void swapBuffers(); +	/*virtual*/ void restoreGLContext() {};  	// handy coordinate space conversion routines  	/*virtual*/ BOOL convertCoords(LLCoordScreen from, LLCoordWindow *to) { return FALSE; }; diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h index c5ce892a04..7193e6f45a 100755 --- a/indra/llwindow/llwindowsdl.h +++ b/indra/llwindow/llwindowsdl.h @@ -97,6 +97,7 @@ public:  	/*virtual*/ void processMiscNativeEvents();  	/*virtual*/ void gatherInput();  	/*virtual*/ void swapBuffers(); +	/*virtual*/ void restoreGLContext() {};  	/*virtual*/ void delayInputProcessing() { }; diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h index 169d264808..2ca8d48fc7 100755 --- a/indra/llwindow/llwindowwin32.h +++ b/indra/llwindow/llwindowwin32.h @@ -83,6 +83,7 @@ public:  	/*virtual*/ void gatherInput();  	/*virtual*/ void delayInputProcessing();  	/*virtual*/ void swapBuffers(); +	/*virtual*/ void restoreGLContext() {};  	// handy coordinate space conversion routines  	/*virtual*/ BOOL convertCoords(LLCoordScreen from, LLCoordWindow *to); diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 94d3c8a59f..e4e9ed168b 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -5004,6 +5004,7 @@        <key>Type</key>        <string>LLSD</string>        <key>Value</key> +      <array />      </map>      <key>LSLFindCaseInsensitivity</key>          <map> @@ -11759,7 +11760,7 @@      <key>Type</key>      <string>F32</string>      <key>Value</key> -    <integer>0.0</integer> +    <real>0.0</real>    </map>      <key>TextureFetchSource</key>      <map> @@ -13202,6 +13203,17 @@        <key>Value</key>        <integer>1</integer>      </map> +    <key>EnvironmentPersistAcrossLogin</key> +    <map> +      <key>Comment</key> +      <string>Keep Environment settings consistent across sessions</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>UseDayCycle</key>      <map>        <key>Comment</key> @@ -14093,17 +14105,6 @@        <key>Value</key>        <integer>-1</integer>      </map> -    <key>MaxFPS</key> -    <map> -      <key>Comment</key> -      <string>Yield some time to the local host if we reach a threshold framerate.</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>F32</string> -      <key>Value</key> -      <real>-1.0</real> -    </map>      <key>ForcePeriodicRenderingTime</key>      <map>        <key>Comment</key> @@ -15595,7 +15596,17 @@        <key>Value</key>        <integer>0</integer>      </map> - +    <key>HTTPNoProtocolShowGreyQuery</key> +    <map> +        <key>Comment</key> +        <string>Enable(disable) appearance of port, query and fragment parts of url for HTTP and HTTPNoProtocol entries in grey.</string> +        <key>Persist</key> +        <integer>1</integer> +        <key>Type</key> +        <string>Boolean</string> +        <key>Value</key> +        <integer>1</integer> +    </map>  </map>  </llsd> diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 2356a84688..b0b2cfd435 100755 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -35,6 +35,7 @@  #include "llfloaterreg.h"  #include "llhudmanager.h"  #include "lljoystickbutton.h" +#include "llmorphview.h"  #include "llmoveview.h"  #include "llselectmgr.h"  #include "llsmoothstep.h" @@ -2269,7 +2270,10 @@ void LLAgentCamera::changeCameraToCustomizeAvatar()  		gFocusMgr.setKeyboardFocus( NULL );  		gFocusMgr.setMouseCapture( NULL ); - +		if( gMorphView ) +		{ +			gMorphView->setVisible( TRUE ); +		}  		// Remove any pitch or rotation from the avatar  		LLVector3 at = gAgent.getAtAxis();  		at.mV[VZ] = 0.f; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index f6b6c71cfc..67007bc4cd 100755 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -685,6 +685,8 @@ LLAppViewer::LLAppViewer()  	mQuitRequested(false),  	mLogoutRequestSent(false),  	mYieldTime(-1), +	mLastAgentControlFlags(0), +	mLastAgentForceUpdate(0),  	mMainloopTimeout(NULL),  	mAgentRegionLastAlive(false),  	mRandomizeFramerate(LLCachedControl<bool>(gSavedSettings,"Randomize Framerate", FALSE)), @@ -4811,22 +4813,24 @@ void LLAppViewer::idle()  			gAgentPilot.updateTarget();  			gAgent.autoPilot(&yaw);  		} -     -	    static LLFrameTimer agent_update_timer; -	    static U32 				last_control_flags; -     -	    //	When appropriate, update agent location to the simulator. -	    F32 agent_update_time = agent_update_timer.getElapsedTimeF32(); -	    BOOL flags_changed = gAgent.controlFlagsDirty() || (last_control_flags != gAgent.getControlFlags()); -		     -	    if (flags_changed || (agent_update_time > (1.0f / (F32) AGENT_UPDATES_PER_SECOND))) -	    { -		    LL_RECORD_BLOCK_TIME(FTM_AGENT_UPDATE); -		    // Send avatar and camera info -		    last_control_flags = gAgent.getControlFlags(); -		    send_agent_update(TRUE); -		    agent_update_timer.reset(); -	    } + +		static LLFrameTimer agent_update_timer; + +		// When appropriate, update agent location to the simulator. +		F32 agent_update_time = agent_update_timer.getElapsedTimeF32(); +		F32 agent_force_update_time = mLastAgentForceUpdate + agent_update_time; +		BOOL force_update = gAgent.controlFlagsDirty() +							|| (mLastAgentControlFlags != gAgent.getControlFlags()) +							|| (agent_force_update_time > (1.0f / (F32) AGENT_FORCE_UPDATES_PER_SECOND)); +		if (force_update || (agent_update_time > (1.0f / (F32) AGENT_UPDATES_PER_SECOND))) +		{ +			LL_RECORD_BLOCK_TIME(FTM_AGENT_UPDATE); +			// Send avatar and camera info +			mLastAgentControlFlags = gAgent.getControlFlags(); +			mLastAgentForceUpdate = force_update ? 0 : agent_force_update_time; +			send_agent_update(force_update); +			agent_update_timer.reset(); +		}  	}  	////////////////////////////////////// diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index e0f3f326c7..e8a1ca036b 100755 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -275,6 +275,8 @@ private:      bool mQuitRequested;				// User wants to quit, may have modified documents open.      bool mLogoutRequestSent;			// Disconnect message sent to simulator, no longer safe to send messages to the sim.      S32 mYieldTime; +	U32 mLastAgentControlFlags; +	F32 mLastAgentForceUpdate;  	struct SettingsFiles* mSettingsLocationList;  	LLWatchdogTimeout* mMainloopTimeout; @@ -314,6 +316,7 @@ public:  // consts from viewer.h  const S32 AGENT_UPDATES_PER_SECOND  = 10; +const S32 AGENT_FORCE_UPDATES_PER_SECOND  = 1;  // Globals with external linkage. From viewer.h  // *NOTE:Mani - These will be removed as the Viewer App Cleanup project continues. diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index a98ff64d0a..02e88a8b89 100755 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -229,21 +229,34 @@ void LLAssetUploadResponder::httpFailure()  {  	// *TODO: Add adaptive retry policy?  	LL_WARNS() << dumpResponse() << LL_ENDL; -	LLSD args; +	std::string reason;  	if (isHttpClientErrorStatus(getStatus()))  	{ -		args["FILE"] = (mFileName.empty() ? mVFileID.asString() : mFileName); -		args["REASON"] = "Error in upload request.  Please visit " +		reason = "Error in upload request.  Please visit "  			"http://secondlife.com/support for help fixing this problem."; -		LLNotificationsUtil::add("CannotUploadReason", args);  	}  	else  	{ -		args["FILE"] = (mFileName.empty() ? mVFileID.asString() : mFileName); -		args["REASON"] = "The server is experiencing unexpected " +		reason = "The server is experiencing unexpected "  			"difficulties."; -		LLNotificationsUtil::add("CannotUploadReason", args);  	} +	LLSD args; +	args["FILE"] = (mFileName.empty() ? mVFileID.asString() : mFileName); +	args["REASON"] = reason; +	LLNotificationsUtil::add("CannotUploadReason", args); + +	// unfreeze script preview +	if(mAssetType == LLAssetType::AT_LSL_TEXT) +	{ +		LLPreviewLSL* preview = LLFloaterReg::findTypedInstance<LLPreviewLSL>("preview_script", mPostData["item_id"]); +		if (preview) +		{ +			LLSD errors; +			errors.append(LLTrans::getString("UploadFailed") + reason); +			preview->callbackLSLCompileFailed(errors); +		} +	} +  	LLUploadDialog::modalUploadFinished();  	LLFilePicker::instance().reset();  // unlock file picker when bulk upload fails  } @@ -298,8 +311,22 @@ void LLAssetUploadResponder::uploadUpload(const LLSD& content)  void LLAssetUploadResponder::uploadFailure(const LLSD& content)  {  	LL_WARNS() << dumpResponse() << LL_ENDL; + +	// unfreeze script preview +	if(mAssetType == LLAssetType::AT_LSL_TEXT) +	{ +		LLPreviewLSL* preview = LLFloaterReg::findTypedInstance<LLPreviewLSL>("preview_script", mPostData["item_id"]); +		if (preview) +		{ +			LLSD errors; +			errors.append(LLTrans::getString("UploadFailed") + content["message"].asString()); +			preview->callbackLSLCompileFailed(errors); +		} +	} +  	// remove the "Uploading..." message  	LLUploadDialog::modalUploadFinished(); +  	LLFloater* floater_snapshot = LLFloaterReg::findInstance("snapshot");  	if (floater_snapshot)  	{ @@ -625,7 +652,10 @@ void LLUpdateTaskInventoryResponder::uploadComplete(const LLSD& content)  		  }  		  else  		  { -			  LLLiveLSLEditor* preview = LLFloaterReg::findTypedInstance<LLLiveLSLEditor>("preview_scriptedit", LLSD(item_id)); +			  LLSD floater_key; +			  floater_key["taskid"] = task_id; +			  floater_key["itemid"] = item_id; +			  LLLiveLSLEditor* preview = LLFloaterReg::findTypedInstance<LLLiveLSLEditor>("preview_scriptedit", floater_key);  			  if (preview)  			  {  				  // Bytecode save completed diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 84b9ac756a..f0bd63ba46 100755 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -1113,7 +1113,15 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL  		if (irc_me && !use_plain_text_chat_history)  		{ -			message = chat.mFromName + message; +			std::string from_name = chat.mFromName; +			LLAvatarName av_name; +			if (!chat.mFromID.isNull() && +						LLAvatarNameCache::get(chat.mFromID, &av_name) && +						!av_name.isDisplayNameDefault()) +			{ +				from_name = av_name.getCompleteName(); +			} +			message = from_name + message;  		}  		if (square_brackets) diff --git a/indra/newview/lldaycyclemanager.cpp b/indra/newview/lldaycyclemanager.cpp index 131675310e..803e2b2fb2 100755 --- a/indra/newview/lldaycyclemanager.cpp +++ b/indra/newview/lldaycyclemanager.cpp @@ -207,7 +207,7 @@ bool LLDayCycleManager::addPreset(const std::string& name, const LLSD& data)  {  	if (name.empty())  	{ -		llassert(name.empty()); +		//llassert(name.empty());  		return false;  	} diff --git a/indra/newview/llenvmanager.cpp b/indra/newview/llenvmanager.cpp index 41d378fea1..a626ad1bff 100755 --- a/indra/newview/llenvmanager.cpp +++ b/indra/newview/llenvmanager.cpp @@ -303,7 +303,8 @@ void LLEnvManagerNew::loadUserPrefs()  	mUserPrefs.mSkyPresetName	= gSavedSettings.getString("SkyPresetName");  	mUserPrefs.mDayCycleName	= gSavedSettings.getString("DayCycleName"); -	mUserPrefs.mUseRegionSettings	= gSavedSettings.getBOOL("UseEnvironmentFromRegion"); +	bool use_region_settings = gSavedSettings.getBOOL("EnvironmentPersistAcrossLogin") ? gSavedSettings.getBOOL("UseEnvironmentFromRegion") : true; +	mUserPrefs.mUseRegionSettings	= use_region_settings;  	mUserPrefs.mUseDayCycle			= gSavedSettings.getBOOL("UseDayCycle");  	if (mUserPrefs.mUseRegionSettings) diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 32b510b21a..dc74f4a6ef 100755 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -956,6 +956,10 @@ void LLFace::getPlanarProjectedParams(LLQuaternion* face_rot, LLVector3* face_po  	const LLVolumeFace& vf = getViewerObject()->getVolume()->getVolumeFace(mTEOffset);  	const LLVector4a& normal4a = vf.mNormals[0];  	const LLVector4a& tangent = vf.mTangents[0]; +	if (!&tangent) +	{ +		return; +	}  	LLVector4a binormal4a;  	binormal4a.setCross3(normal4a, tangent); @@ -1299,15 +1303,15 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  			}  			if (shiny_in_alpha) -		{ - -			GLfloat alpha[4] =  			{ -				0.00f, -				0.25f, -				0.5f, -				0.75f -			}; + +				static const GLfloat alpha[4] = +				{ +					0.00f, +					0.25f, +					0.5f, +					0.75f +				};  				llassert(tep->getShiny() <= 3);  				color.mV[3] = U8 (alpha[tep->getShiny()] * 255); diff --git a/indra/newview/llfloaterbump.cpp b/indra/newview/llfloaterbump.cpp index ad44c509d9..34904cf7ed 100755 --- a/indra/newview/llfloaterbump.cpp +++ b/indra/newview/llfloaterbump.cpp @@ -30,10 +30,17 @@  #include "llsd.h"  #include "mean_collision_data.h" +#include "llavataractions.h"  #include "llfloaterbump.h" +#include "llfloaterreporter.h" +#include "llmutelist.h" +#include "llpanelblockedlist.h"  #include "llscrolllistctrl.h" +#include "lltrans.h"  #include "lluictrlfactory.h"  #include "llviewermessage.h" +#include "llviewermenu.h" +#include "llviewerobjectlist.h"  ///----------------------------------------------------------------------------  /// Class LLFloaterBump @@ -43,6 +50,18 @@  LLFloaterBump::LLFloaterBump(const LLSD& key)   :	LLFloater(key)  { +	mCommitCallbackRegistrar.add("Avatar.SendIM", boost::bind(&LLFloaterBump::startIM, this)); +	mCommitCallbackRegistrar.add("Avatar.ReportAbuse", boost::bind(&LLFloaterBump::reportAbuse, this)); +	mCommitCallbackRegistrar.add("ShowAgentProfile", boost::bind(&LLFloaterBump::showProfile, this)); +	mCommitCallbackRegistrar.add("Avatar.InviteToGroup", boost::bind(&LLFloaterBump::inviteToGroup, this)); +	mCommitCallbackRegistrar.add("Avatar.Call", boost::bind(&LLFloaterBump::startCall, this)); +	mEnableCallbackRegistrar.add("Avatar.EnableCall", boost::bind(&LLAvatarActions::canCall)); +	mCommitCallbackRegistrar.add("Avatar.AddFriend", boost::bind(&LLFloaterBump::addFriend, this)); +	mEnableCallbackRegistrar.add("Avatar.EnableAddFriend", boost::bind(&LLFloaterBump::enableAddFriend, this)); +	mCommitCallbackRegistrar.add("Avatar.Mute", boost::bind(&LLFloaterBump::muteAvatar, this)); +	mEnableCallbackRegistrar.add("Avatar.EnableMute", boost::bind(&LLFloaterBump::enableMute, this)); +	mCommitCallbackRegistrar.add("PayObject", boost::bind(&LLFloaterBump::payAvatar, this)); +	mCommitCallbackRegistrar.add("Tools.LookAtSelection", boost::bind(&LLFloaterBump::zoomInAvatar, this));  } @@ -51,13 +70,25 @@ LLFloaterBump::~LLFloaterBump()  {  } +BOOL LLFloaterBump::postBuild() +{ +	mList = getChild<LLScrollListCtrl>("bump_list"); +	mList->setAllowMultipleSelection(false); +	mList->setRightMouseDownCallback(boost::bind(&LLFloaterBump::onScrollListRightClicked, this, _1, _2, _3)); + +	mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>("menu_avatar_other.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); +	mPopupMenu->setItemVisible(std::string("Normal"), false); +	mPopupMenu->setItemVisible(std::string("Always use impostor"), false); +	mPopupMenu->setItemVisible(std::string("Never use impostor"), false); +	mPopupMenu->setItemVisible(std::string("Impostor seperator"), false); + +	return TRUE; +}  // virtual  void LLFloaterBump::onOpen(const LLSD& key)  { -	LLScrollListCtrl* list = getChild<LLScrollListCtrl>("bump_list"); -	if (!list) -		return; -	list->deleteAllItems(); +	mNames.clear(); +	mList->deleteAllItems();  	if (gMeanCollisionList.empty())  	{ @@ -65,7 +96,7 @@ void LLFloaterBump::onOpen(const LLSD& key)  		LLSD row;  		row["columns"][0]["value"] = none_detected;  		row["columns"][0]["font"] = "SansSerifBold"; -		list->addElement(row); +		mList->addElement(row);  	}  	else  	{ @@ -73,7 +104,7 @@ void LLFloaterBump::onOpen(const LLSD& key)  			 iter != gMeanCollisionList.end(); ++iter)  		{  			LLMeanCollisionData *mcd = *iter; -			add(list, mcd); +			add(mList, mcd);  		}  	}  } @@ -125,4 +156,94 @@ void LLFloaterBump::add(LLScrollListCtrl* list, LLMeanCollisionData* mcd)  	row["columns"][0]["value"] = text;  	row["columns"][0]["font"] = "SansSerifBold";  	list->addElement(row); + + +	mNames[mcd->mPerp] = mcd->mFullName; +} + + +void LLFloaterBump::onScrollListRightClicked(LLUICtrl* ctrl, S32 x, S32 y) +{ +	if (!gMeanCollisionList.empty()) +	{ +		LLScrollListItem* item = mList->hitItem(x, y); +		if (item && mPopupMenu) +		{ +			mItemUUID = item->getUUID(); +			mPopupMenu->buildDrawLabels(); +			mPopupMenu->updateParent(LLMenuGL::sMenuContainer); + +			std::string mute_msg = (LLMuteList::getInstance()->isMuted(mItemUUID, mNames[mItemUUID])) ? "UnmuteAvatar" : "MuteAvatar"; +			mPopupMenu->getChild<LLUICtrl>("Avatar Mute")->setValue(LLTrans::getString(mute_msg)); +			mPopupMenu->setItemEnabled(std::string("Zoom In"), (BOOL)gObjectList.findObject(mItemUUID)); + +			((LLContextMenu*)mPopupMenu)->show(x, y); +			LLMenuGL::showPopup(ctrl, mPopupMenu, x, y); +		} +	} +} + + +void LLFloaterBump::startIM() +{ +	LLAvatarActions::startIM(mItemUUID); +} + +void LLFloaterBump::startCall() +{ +	LLAvatarActions::startCall(mItemUUID); +} + +void LLFloaterBump::reportAbuse() +{ +	LLFloaterReporter::showFromAvatar(mItemUUID, "av_name"); +} + +void LLFloaterBump::showProfile() +{ +	LLAvatarActions::showProfile(mItemUUID); +} + +void LLFloaterBump::addFriend() +{ +	LLAvatarActions::requestFriendshipDialog(mItemUUID); +} + +bool LLFloaterBump::enableAddFriend() +{ +	return !LLAvatarActions::isFriend(mItemUUID); +} + +void LLFloaterBump::muteAvatar() +{ +	LLMute mute(mItemUUID, mNames[mItemUUID], LLMute::AGENT); +	if (LLMuteList::getInstance()->isMuted(mute.mID)) +	{ +		LLMuteList::getInstance()->remove(mute); +	} +	else +	{ +		LLMuteList::getInstance()->add(mute); +		LLPanelBlockedList::showPanelAndSelect(mute.mID); +	} +} + +void LLFloaterBump::payAvatar() +{ +	LLAvatarActions::pay(mItemUUID); +} + +void LLFloaterBump::zoomInAvatar() +{ +	handle_zoom_to_object(mItemUUID); +} + +bool LLFloaterBump::enableMute() +{ +	return LLAvatarActions::canBlock(mItemUUID); +} + +void LLFloaterBump::inviteToGroup() +{ +	LLAvatarActions::inviteToGroup(mItemUUID);  } diff --git a/indra/newview/llfloaterbump.h b/indra/newview/llfloaterbump.h index 5acab6da8c..11b7db9fee 100755 --- a/indra/newview/llfloaterbump.h +++ b/indra/newview/llfloaterbump.h @@ -29,6 +29,7 @@  #define LL_LLFLOATERBUMP_H  #include "llfloater.h" +#include "llmenugl.h"  class LLMeanCollisionData;  class LLScrollListCtrl; @@ -39,14 +40,36 @@ class LLFloaterBump  	friend class LLFloaterReg;  protected:  	void add(LLScrollListCtrl* list, LLMeanCollisionData *mcd); +	void onScrollListRightClicked(LLUICtrl* ctrl, S32 x, S32 y);  public: +	/*virtual*/	BOOL postBuild();  	/*virtual*/ void onOpen(const LLSD& key); +	void startIM(); +	void startCall(); +	void reportAbuse(); +	void showProfile(); +	void addFriend(); +	void inviteToGroup(); +	bool enableAddFriend(); +	void muteAvatar(); +	void payAvatar(); +	void zoomInAvatar(); +	bool enableMute(); +  private:  	LLFloaterBump(const LLSD& key);  	virtual ~LLFloaterBump(); + +	LLScrollListCtrl* mList; +	LLMenuGL* mPopupMenu; +	LLUUID mItemUUID; + +	typedef std::map<LLUUID, std::string> uuid_map_t; +	uuid_map_t mNames; +  };  #endif diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp index 0c59ba9a6d..535cb368bd 100755 --- a/indra/newview/llfloatercolorpicker.cpp +++ b/indra/newview/llfloatercolorpicker.cpp @@ -342,11 +342,6 @@ void LLFloaterColorPicker::setCurRgb ( F32 curRIn, F32 curGIn, F32 curBIn )  	curG = curGIn;  	curB = curBIn; -	if (mApplyImmediateCheck->get()) -	{ -		LLColorSwatchCtrl::onColorChanged ( getSwatch (), LLColorSwatchCtrl::COLOR_CHANGE ); -	} -  	// update corresponding HSL values and  	LLColor3(curRIn, curGIn, curBIn).calcHSL(&curH, &curS, &curL); @@ -374,11 +369,6 @@ void LLFloaterColorPicker::setCurHsl ( F32 curHIn, F32 curSIn, F32 curLIn )  	// update corresponding RGB values and  	hslToRgb ( curH, curS, curL, curR, curG, curB ); - -	if (mApplyImmediateCheck->get()) -	{ -		LLColorSwatchCtrl::onColorChanged ( getSwatch (), LLColorSwatchCtrl::COLOR_CHANGE ); -	}  }  ////////////////////////////////////////////////////////////////////////////// @@ -467,7 +457,8 @@ void LLFloaterColorPicker::onImmediateCheck( LLUICtrl* ctrl, void* data)  void LLFloaterColorPicker::onColorSelect( const LLTextureEntry& te )  { -	setCurRgb(te.getColor().mV[VRED], te.getColor().mV[VGREEN], te.getColor().mV[VBLUE]); +	// Pipete +	selectCurRgb(te.getColor().mV[VRED], te.getColor().mV[VGREEN], te.getColor().mV[VBLUE]);  }  void LLFloaterColorPicker::onMouseCaptureLost() @@ -643,6 +634,28 @@ const LLColor4& LLFloaterColorPicker::getComplimentaryColor ( const LLColor4& ba  }  ////////////////////////////////////////////////////////////////////////////// +// set current RGB and rise change event if needed. +void LLFloaterColorPicker::selectCurRgb ( F32 curRIn, F32 curGIn, F32 curBIn ) +{ +	setCurRgb(curRIn, curGIn, curBIn); +	if (mApplyImmediateCheck->get()) +	{ +		LLColorSwatchCtrl::onColorChanged ( getSwatch (), LLColorSwatchCtrl::COLOR_CHANGE ); +	} +} + +////////////////////////////////////////////////////////////////////////////// +// set current HSL and rise change event if needed. +void LLFloaterColorPicker::selectCurHsl ( F32 curHIn, F32 curSIn, F32 curLIn ) +{ +	setCurHsl(curHIn, curSIn, curLIn); +	if (mApplyImmediateCheck->get()) +	{ +		LLColorSwatchCtrl::onColorChanged ( getSwatch (), LLColorSwatchCtrl::COLOR_CHANGE ); +	} +} + +//////////////////////////////////////////////////////////////////////////////  // draw color palette  void LLFloaterColorPicker::drawPalette ()  { @@ -736,7 +749,7 @@ void LLFloaterColorPicker::onTextEntryChanged ( LLUICtrl* ctrl )  		}  		// update current RGB (and implicitly HSL) -		setCurRgb ( rVal, gVal, bVal ); +		selectCurRgb ( rVal, gVal, bVal );  		updateTextEntry ();  	} @@ -759,15 +772,10 @@ void LLFloaterColorPicker::onTextEntryChanged ( LLUICtrl* ctrl )  			lVal = (F32)ctrl->getValue().asReal() / 100.0f;  		// update current HSL (and implicitly RGB) -		setCurHsl ( hVal, sVal, lVal ); +		selectCurHsl ( hVal, sVal, lVal );  		updateTextEntry ();  	} - -	if (mApplyImmediateCheck->get()) -	{ -		LLColorSwatchCtrl::onColorChanged ( getSwatch (), LLColorSwatchCtrl::COLOR_CHANGE ); -	}  }  ////////////////////////////////////////////////////////////////////////////// @@ -780,7 +788,7 @@ BOOL LLFloaterColorPicker::updateRgbHslFromPoint ( S32 xPosIn, S32 yPosIn )  		 yPosIn >= mRGBViewerImageTop - mRGBViewerImageHeight )  	{  		// update HSL (and therefore RGB) based on new H & S and current L -		setCurHsl ( ( ( F32 )xPosIn - ( F32 )mRGBViewerImageLeft ) / ( F32 )mRGBViewerImageWidth, +		selectCurHsl ( ( ( F32 )xPosIn - ( F32 )mRGBViewerImageLeft ) / ( F32 )mRGBViewerImageWidth,  					( ( F32 )yPosIn - ( ( F32 )mRGBViewerImageTop - ( F32 )mRGBViewerImageHeight ) ) / ( F32 )mRGBViewerImageHeight,  					getCurL () ); @@ -795,7 +803,7 @@ BOOL LLFloaterColorPicker::updateRgbHslFromPoint ( S32 xPosIn, S32 yPosIn )  	{  		// update HSL (and therefore RGB) based on current HS and new L -		 setCurHsl ( getCurH (), +		 selectCurHsl ( getCurH (),  					 getCurS (),  					( ( F32 )yPosIn - ( ( F32 )mRGBViewerImageTop - ( F32 )mRGBViewerImageHeight ) ) / ( F32 )mRGBViewerImageHeight ); @@ -887,7 +895,7 @@ BOOL LLFloaterColorPicker::handleMouseDown ( S32 x, S32 y, MASK mask )  		{  			LLColor4 selected = *mPalette [ index ]; -			setCurRgb ( selected [ 0 ], selected [ 1 ], selected [ 2 ] ); +			selectCurRgb ( selected [ 0 ], selected [ 1 ], selected [ 2 ] );  			if (mApplyImmediateCheck->get())  			{ diff --git a/indra/newview/llfloatercolorpicker.h b/indra/newview/llfloatercolorpicker.h index d4d22b643a..8c16ebdf03 100755 --- a/indra/newview/llfloatercolorpicker.h +++ b/indra/newview/llfloatercolorpicker.h @@ -122,6 +122,9 @@ class LLFloaterColorPicker  		static void onImmediateCheck ( LLUICtrl* ctrl, void* data );  			   void onColorSelect( const class LLTextureEntry& te );  	private: +		// mutators for color values, can raise event to preview changes at object +		void selectCurRgb ( F32 curRIn, F32 curGIn, F32 curBIn ); +		void selectCurHsl ( F32 curHIn, F32 curSIn, F32 curLIn );  		// draws color selection palette  		void drawPalette (); diff --git a/indra/newview/llfloaterflickr.cpp b/indra/newview/llfloaterflickr.cpp index 36afab86b7..600606d838 100644 --- a/indra/newview/llfloaterflickr.cpp +++ b/indra/newview/llfloaterflickr.cpp @@ -51,7 +51,7 @@  #include "lltabcontainer.h"  #include "llviewerparcelmgr.h"  #include "llviewerregion.h" - +#include <boost/regex.hpp>  static LLPanelInjector<LLFlickrPhotoPanel> t_panel_photo("llflickrphotopanel");  static LLPanelInjector<LLFlickrAccountPanel> t_panel_account("llflickraccountpanel"); @@ -345,7 +345,12 @@ void LLFlickrPhotoPanel::sendPhoto()  		std::string parcel_name = LLViewerParcelMgr::getInstance()->getAgentParcelName();  		if (!parcel_name.empty())  		{ -			photo_link_text += " at " + parcel_name; +			boost::regex pattern = boost::regex("\\S\\.[a-zA-Z]{2,}"); +			boost::match_results<std::string::const_iterator> matches; +			if(!boost::regex_search(parcel_name, matches, pattern)) +			{ +				photo_link_text += " at " + parcel_name; +			}  		}  		photo_link_text += " in Second Life"; diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 2864f018b2..357b635594 100755 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -118,6 +118,7 @@ LLFloaterIMSessionTab* LLFloaterIMSessionTab::getConversation(const LLUUID& uuid  	else  	{  		conv = LLFloaterReg::getTypedInstance<LLFloaterIMSessionTab>("impanel", LLSD(uuid)); +		conv->setOpenPositioning(LLFloaterEnums::POSITIONING_RELATIVE);  	}  	return conv; diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp index 5a1dfc99ab..10088d20c2 100755 --- a/indra/newview/llfloaterinspect.cpp +++ b/indra/newview/llfloaterinspect.cpp @@ -32,6 +32,7 @@  #include "llfloatertools.h"  #include "llavataractions.h"  #include "llavatarnamecache.h" +#include "llgroupactions.h"  #include "llscrolllistctrl.h"  #include "llscrolllistitem.h"  #include "llselectmgr.h" @@ -147,8 +148,17 @@ void LLFloaterInspect::onClickOwnerProfile()  		LLSelectNode* node = mObjectSelection->getFirstNode(&func);  		if(node)  		{ -			const LLUUID& owner_id = node->mPermissions->getOwner(); -			LLAvatarActions::showProfile(owner_id); +			if(node->mPermissions->isGroupOwned()) +			{ +				const LLUUID& idGroup = node->mPermissions->getGroup(); +				LLGroupActions::show(idGroup); +			} +			else +			{ +				const LLUUID& owner_id = node->mPermissions->getOwner(); +				LLAvatarActions::showProfile(owner_id); +			} +  		}  	}  } @@ -219,21 +229,42 @@ void LLFloaterInspect::refresh()  		const LLUUID& idCreator = obj->mPermissions->getCreator();  		LLAvatarName av_name; -		// Only work with the names if we actually get a result -		// from the name cache. If not, defer setting the -		// actual name and set a placeholder. -		if (LLAvatarNameCache::get(idOwner, &av_name)) +		if(obj->mPermissions->isGroupOwned())  		{ -			owner_name = av_name.getCompleteName(); +			std::string group_name; +			const LLUUID& idGroup = obj->mPermissions->getGroup(); +			if(gCacheName->getGroupName(idGroup, group_name)) +			{ +				owner_name = "[" + group_name + "] (group)"; +			} +			else +			{ +				owner_name = LLTrans::getString("RetrievingData"); +				if (mOwnerNameCacheConnection.connected()) +				{ +					mOwnerNameCacheConnection.disconnect(); +				} +				mOwnerNameCacheConnection = gCacheName->getGroup(idGroup, boost::bind(&LLFloaterInspect::onGetOwnerNameCallback, this)); +			}  		}  		else  		{ -			owner_name = LLTrans::getString("RetrievingData"); -			if (mOwnerNameCacheConnection.connected()) +			// Only work with the names if we actually get a result +			// from the name cache. If not, defer setting the +			// actual name and set a placeholder. +			if (LLAvatarNameCache::get(idOwner, &av_name)) +			{ +				owner_name = av_name.getCompleteName(); +			} +			else  			{ -				mOwnerNameCacheConnection.disconnect(); +				owner_name = LLTrans::getString("RetrievingData"); +				if (mOwnerNameCacheConnection.connected()) +				{ +					mOwnerNameCacheConnection.disconnect(); +				} +				mOwnerNameCacheConnection = LLAvatarNameCache::get(idOwner, boost::bind(&LLFloaterInspect::onGetOwnerNameCallback, this));  			} -			mOwnerNameCacheConnection = LLAvatarNameCache::get(idOwner, boost::bind(&LLFloaterInspect::onGetOwnerNameCallback, this));  		}  		if (LLAvatarNameCache::get(idCreator, &av_name)) diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 7621c35ed2..3cef7958c2 100755 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -1983,6 +1983,7 @@ void LLPanelLandOptions::refresh()  	else  	{  		// something selected, hooray! +		LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion();  		// Display options  		BOOL can_change_options = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_OPTIONS); @@ -1998,8 +1999,9 @@ void LLPanelLandOptions::refresh()  		mCheckGroupObjectEntry	->set( parcel->getAllowGroupObjectEntry() ||  parcel->getAllowAllObjectEntry());  		mCheckGroupObjectEntry	->setEnabled( can_change_options && !parcel->getAllowAllObjectEntry() ); +		BOOL region_damage = regionp ? regionp->getAllowDamage() : FALSE;  		mCheckSafe			->set( !parcel->getAllowDamage() ); -		mCheckSafe			->setEnabled( can_change_options ); +		mCheckSafe			->setEnabled( can_change_options && region_damage );  		mCheckFly			->set( parcel->getAllowFly() );  		mCheckFly			->setEnabled( can_change_options ); @@ -2079,7 +2081,6 @@ void LLPanelLandOptions::refresh()  			// they can see the checkbox, but its disposition depends on the   			// state of the region -			LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion();  			if (regionp)  			{  				if (regionp->getSimAccess() == SIM_ACCESS_PG) diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 0c81ab7e79..e0a998c369 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -738,6 +738,11 @@ void LLFloaterModelPreview::toggleGenarateNormals()  {  	bool enabled = childGetValue("gen_normals").asBoolean();  	childSetEnabled("crease_angle", enabled); +	if(enabled) { +		mModelPreview->generateNormals(); +	} else { +		mModelPreview->restoreNormals(); +	}  }  //static @@ -3840,7 +3845,6 @@ void LLModelPreview::generateNormals()  	S32 which_lod = mPreviewLOD; -  	if (which_lod > 4 || which_lod < 0 ||  		mModel[which_lod].empty())  	{ @@ -3855,19 +3859,81 @@ void LLModelPreview::generateNormals()  	if (which_lod == 3 && !mBaseModel.empty())  	{ -		for (LLModelLoader::model_list::iterator iter = mBaseModel.begin(); iter != mBaseModel.end(); ++iter) +		if(mBaseModelFacesCopy.empty()) +		{ +			mBaseModelFacesCopy.reserve(mBaseModel.size()); +			for (LLModelLoader::model_list::iterator it = mBaseModel.begin(), itE = mBaseModel.end(); it != itE; ++it) +			{ +				v_LLVolumeFace_t faces; +				(*it)->copyFacesTo(faces); +				mBaseModelFacesCopy.push_back(faces); +			} +		} + +		for (LLModelLoader::model_list::iterator it = mBaseModel.begin(), itE = mBaseModel.end(); it != itE; ++it)  		{ -			(*iter)->generateNormals(angle_cutoff); +			(*it)->generateNormals(angle_cutoff);  		}  		mVertexBuffer[5].clear();  	} -	for (LLModelLoader::model_list::iterator iter = mModel[which_lod].begin(); iter != mModel[which_lod].end(); ++iter) +	bool perform_copy = mModelFacesCopy[which_lod].empty(); +	if(perform_copy) { +		mModelFacesCopy[which_lod].reserve(mModel[which_lod].size()); +	} + +	for (LLModelLoader::model_list::iterator it = mModel[which_lod].begin(), itE = mModel[which_lod].end(); it != itE; ++it) +	{ +		if(perform_copy) +		{ +			v_LLVolumeFace_t faces; +			(*it)->copyFacesTo(faces); +			mModelFacesCopy[which_lod].push_back(faces); +		} + +		(*it)->generateNormals(angle_cutoff); +	} + +	mVertexBuffer[which_lod].clear(); +	refresh(); +	updateStatusMessages(); +} + +void LLModelPreview::restoreNormals() +{ +	S32 which_lod = mPreviewLOD; + +	if (which_lod > 4 || which_lod < 0 || +		mModel[which_lod].empty()) +	{ +		return; +	} + +	if(!mBaseModelFacesCopy.empty())  	{ -		(*iter)->generateNormals(angle_cutoff); +		llassert(mBaseModelFacesCopy.size() == mBaseModel.size()); + +		vv_LLVolumeFace_t::const_iterator itF = mBaseModelFacesCopy.begin(); +		for (LLModelLoader::model_list::iterator it = mBaseModel.begin(), itE = mBaseModel.end(); it != itE; ++it, ++itF) +		{ +			(*it)->copyFacesFrom((*itF)); +		} + +		mBaseModelFacesCopy.clear();  	} +	 +	if(!mModelFacesCopy[which_lod].empty()) +	{ +		vv_LLVolumeFace_t::const_iterator itF = mModelFacesCopy[which_lod].begin(); +		for (LLModelLoader::model_list::iterator it = mModel[which_lod].begin(), itE = mModel[which_lod].end(); it != itE; ++it, ++itF) +		{ +			(*it)->copyFacesFrom((*itF)); +		} +		mModelFacesCopy[which_lod].clear(); +	} +	  	mVertexBuffer[which_lod].clear();  	refresh();  	updateStatusMessages(); diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 6c0c60b87f..618748bd4e 100755 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -343,6 +343,7 @@ public:  	void loadModelCallback(S32 lod);  	void genLODs(S32 which_lod = -1, U32 decimation = 3, bool enforce_tri_limit = false);  	void generateNormals(); +	void restoreNormals();  	U32 calcResourceCost();  	void rebuildUploadData();  	void saveUploadData(bool save_skinweights, bool save_joint_poisitions); @@ -447,6 +448,12 @@ private:  	LLModelLoader::model_list mModel[LLModel::NUM_LODS];  	LLModelLoader::model_list mBaseModel; +	typedef std::vector<LLVolumeFace>		v_LLVolumeFace_t; +	typedef std::vector<v_LLVolumeFace_t>	vv_LLVolumeFace_t; +	 +	vv_LLVolumeFace_t mModelFacesCopy[LLModel::NUM_LODS]; +	vv_LLVolumeFace_t mBaseModelFacesCopy; +  	U32 mGroup;  	std::map<LLPointer<LLModel>, U32> mObject;  	U32 mMaxTriangleLimit; diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index a3bf99f054..6bfc780722 100755 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -36,6 +36,7 @@  #include "llagent.h"  #include "llbutton.h"  #include "llcheckboxctrl.h" +#include "llcombobox.h"  #include "llavataractions.h"  #include "llinventorydefines.h"  #include "llinventoryobserver.h" @@ -143,7 +144,7 @@ BOOL LLFloaterProperties::postBuild()  	getChild<LLUICtrl>("CheckNextOwnerTransfer")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitPermissions, this));  	// Mark for sale or not, and sale info  	getChild<LLUICtrl>("CheckPurchase")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitSaleInfo, this)); -	getChild<LLUICtrl>("RadioSaleType")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitSaleType, this)); +	getChild<LLUICtrl>("ComboBoxSaleType")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitSaleType, this));  	// "Price" label for edit  	getChild<LLUICtrl>("Edit Cost")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitSaleInfo, this));  	// The UI has been built, now fill in all the values @@ -188,7 +189,7 @@ void LLFloaterProperties::refresh()  			"CheckNextOwnerCopy",  			"CheckNextOwnerTransfer",  			"CheckPurchase", -			"RadioSaleType", +			"ComboBoxSaleType",  			"Edit Cost"  		};  		for(size_t t=0; t<LL_ARRAY_SIZE(enableNames); ++t) @@ -479,6 +480,9 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)  	const LLSaleInfo& sale_info = item->getSaleInfo();  	BOOL is_for_sale = sale_info.isForSale(); +	LLComboBox* combo_sale_type = getChild<LLComboBox>("ComboBoxSaleType"); +	LLUICtrl* edit_cost = getChild<LLUICtrl>("Edit Cost"); +  	// Check for ability to change values.  	if (is_obj_modify && can_agent_sell   		&& gAgent.allowOperation(PERM_TRANSFER, perm, GP_OBJECT_MANIPULATE)) @@ -491,9 +495,9 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)  		getChildView("CheckNextOwnerCopy")->setEnabled((base_mask & PERM_COPY) && !cannot_restrict_permissions);  		getChildView("CheckNextOwnerTransfer")->setEnabled((next_owner_mask & PERM_COPY) && !cannot_restrict_permissions); -		getChildView("RadioSaleType")->setEnabled(is_complete && is_for_sale);  		getChildView("TextPrice")->setEnabled(is_complete && is_for_sale); -		getChildView("Edit Cost")->setEnabled(is_complete && is_for_sale); +		combo_sale_type->setEnabled(is_complete && is_for_sale); +		edit_cost->setEnabled(is_complete && is_for_sale);  	}  	else  	{ @@ -505,31 +509,28 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)  		getChildView("CheckNextOwnerCopy")->setEnabled(FALSE);  		getChildView("CheckNextOwnerTransfer")->setEnabled(FALSE); -		getChildView("RadioSaleType")->setEnabled(FALSE);  		getChildView("TextPrice")->setEnabled(FALSE); -		getChildView("Edit Cost")->setEnabled(FALSE); +		combo_sale_type->setEnabled(FALSE); +		edit_cost->setEnabled(FALSE);  	}  	// Set values.  	getChild<LLUICtrl>("CheckPurchase")->setValue(is_for_sale); -	getChildView("combobox sale copy")->setEnabled(is_for_sale); -	getChildView("Edit Cost")->setEnabled(is_for_sale);  	getChild<LLUICtrl>("CheckNextOwnerModify")->setValue(LLSD(BOOL(next_owner_mask & PERM_MODIFY)));  	getChild<LLUICtrl>("CheckNextOwnerCopy")->setValue(LLSD(BOOL(next_owner_mask & PERM_COPY)));  	getChild<LLUICtrl>("CheckNextOwnerTransfer")->setValue(LLSD(BOOL(next_owner_mask & PERM_TRANSFER))); -	LLRadioGroup* radioSaleType = getChild<LLRadioGroup>("RadioSaleType");  	if (is_for_sale)  	{ -		radioSaleType->setSelectedIndex((S32)sale_info.getSaleType() - 1);  		S32 numerical_price;  		numerical_price = sale_info.getSalePrice(); -		getChild<LLUICtrl>("Edit Cost")->setValue(llformat("%d",numerical_price)); +		edit_cost->setValue(llformat("%d",numerical_price)); +		combo_sale_type->setValue(sale_info.getSaleType());  	}  	else  	{ -		radioSaleType->setSelectedIndex(-1); -		getChild<LLUICtrl>("Edit Cost")->setValue(llformat("%d",0)); +		edit_cost->setValue(llformat("%d",0)); +		combo_sale_type->setValue(LLSaleInfo::FS_COPY);  	}  } @@ -757,25 +758,11 @@ void LLFloaterProperties::updateSaleInfo()  	{  		// turn on sale info  		LLSaleInfo::EForSale sale_type = LLSaleInfo::FS_COPY; -	 -		LLRadioGroup* RadioSaleType = getChild<LLRadioGroup>("RadioSaleType"); -		if(RadioSaleType) + +		LLComboBox* combo_sale_type = getChild<LLComboBox>("ComboBoxSaleType"); +		if (combo_sale_type)  		{ -			switch (RadioSaleType->getSelectedIndex()) -			{ -			case 0: -				sale_type = LLSaleInfo::FS_ORIGINAL; -				break; -			case 1: -				sale_type = LLSaleInfo::FS_COPY; -				break; -			case 2: -				sale_type = LLSaleInfo::FS_CONTENTS; -				break; -			default: -				sale_type = LLSaleInfo::FS_COPY; -				break; -			} +			sale_type = static_cast<LLSaleInfo::EForSale>(combo_sale_type->getValue().asInteger());  		}  		if (sale_type == LLSaleInfo::FS_COPY  diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 04329ff66e..43f6576dc9 100755 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -1193,6 +1193,22 @@ void LLFloaterSnapshot::onOpen(const LLSD& key)  void LLFloaterSnapshot::onClose(bool app_quitting)  {  	getParent()->setMouseOpaque(FALSE); + +	//unfreeze everything, hide fullscreen preview +	LLSnapshotLivePreview* previewp = LLFloaterSnapshot::Impl::getPreviewView(this); +	if (previewp) +	{ +		previewp->setVisible(FALSE); +		previewp->setEnabled(FALSE); +	} + +	gSavedSettings.setBOOL("FreezeTime", FALSE); +	impl.mAvatarPauseHandles.clear(); + +	if (impl.mLastToolset) +	{ +		LLToolMgr::getInstance()->setCurrentToolset(impl.mLastToolset); +	}  }  // virtual diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp index fadbf78ca5..2ba9142763 100755 --- a/indra/newview/llhudeffectlookat.cpp +++ b/indra/newview/llhudeffectlookat.cpp @@ -39,8 +39,7 @@  #include "llrendersphere.h"  #include "llselectmgr.h"  #include "llglheaders.h" -#include "llfontgl.h" -#include "llhudrender.h" +  #include "llxmltree.h" @@ -497,15 +496,14 @@ void LLHUDEffectLookAt::render()  	{  		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -		LLVOAvatar* source_avatar = ((LLVOAvatar*)(LLViewerObject*)mSourceObject); -		LLVector3 target = mTargetPos + source_avatar->mHeadp->getWorldPosition(); +		LLVector3 target = mTargetPos + ((LLVOAvatar*)(LLViewerObject*)mSourceObject)->mHeadp->getWorldPosition();  		gGL.matrixMode(LLRender::MM_MODELVIEW);  		gGL.pushMatrix();  		gGL.translatef(target.mV[VX], target.mV[VY], target.mV[VZ]);  		gGL.scalef(0.3f, 0.3f, 0.3f); -		LLColor3 color = (*mAttentions)[mTargetType].mColor;  		gGL.begin(LLRender::LINES);  		{ +			LLColor3 color = (*mAttentions)[mTargetType].mColor;  			gGL.color3f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE]);  			gGL.vertex3f(-1.f, 0.f, 0.f);  			gGL.vertex3f(1.f, 0.f, 0.f); @@ -517,17 +515,6 @@ void LLHUDEffectLookAt::render()  			gGL.vertex3f(0.f, 0.f, 1.f);  		} gGL.end();  		gGL.popMatrix(); - - -		if(!source_avatar->isSelf()) -		{ -			std::string av_name = source_avatar->getFullname(); -			const LLFontGL* big_fontp = LLFontGL::getFontSansSerif(); -			gGL.pushMatrix(); -			hud_render_utf8text(av_name,target+LLVector3(0.f,0.f,0.4f),*big_fontp,LLFontGL::NORMAL,LLFontGL::DROP_SHADOW_SOFT,-0.5*big_fontp->getWidthF32(av_name),3.f,color,FALSE); -			gGL.popMatrix(); -		} -  	}  } diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 8d8239611c..5d3a11e245 100755 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -3061,6 +3061,24 @@ void LLIMMgr::inviteToSession(  		{  			if (gAgent.isDoNotDisturb() && !isRejectGroupCall && !isRejectNonFriendCall)  			{ +				if (!hasSession(session_id) && (type == IM_SESSION_P2P_INVITE)) +				{ +					std::string fixed_session_name = caller_name; +					if(!session_name.empty() && session_name.size()>1) +					{ +						fixed_session_name = session_name; +					} +					else +					{ +						LLAvatarName av_name; +						if (LLAvatarNameCache::get(caller_id, &av_name)) +						{ +							fixed_session_name = av_name.getDisplayName(); +						} +					} +					LLIMModel::getInstance()->newSession(session_id, fixed_session_name, IM_NOTHING_SPECIAL, caller_id, false, false); +				} +  				LLSD args;  				addSystemMessage(session_id, "you_auto_rejected_call", args);  				send_do_not_disturb_message(gMessageSystem, caller_id, session_id); diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp index a7b93b8030..46019557f8 100755 --- a/indra/newview/llinspectobject.cpp +++ b/indra/newview/llinspectobject.cpp @@ -219,7 +219,7 @@ void LLInspectObject::onOpen(const LLSD& data)  		LLViewerMediaFocus::getInstance()->clearFocus();  		LLSelectMgr::instance().deselectAll(); -		mObjectSelection = LLSelectMgr::instance().selectObjectAndFamily(obj); +		mObjectSelection = LLSelectMgr::instance().selectObjectAndFamily(obj,FALSE,TRUE);  		// Mark this as a transient selection  		struct SetTransient : public LLSelectedNodeFunctor diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp index 897ee8429a..4a89fc92b4 100755 --- a/indra/newview/lllocalbitmaps.cpp +++ b/indra/newview/lllocalbitmaps.cpp @@ -64,6 +64,8 @@  #include "llimagedimensionsinfo.h"  #include "llviewercontrol.h"  #include "lltrans.h" +#include "llviewerdisplay.h" +  /*=======================================*/  /*  Formal declarations, constants, etc. */  /*=======================================*/  @@ -842,6 +844,9 @@ bool LLLocalBitmapMgr::addUnit()  	LLFilePicker& picker = LLFilePicker::instance();  	if (picker.getMultipleOpenFiles(LLFilePicker::FFLOAD_IMAGE))  	{ +		//For fix problem with Core Flow view on OSX +        restoreGLContext(); +          		sTimer.stopTimer();  		std::string filename = picker.getFirstFile(); diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index 407cbfc47b..451f41cd3b 100755 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -197,9 +197,6 @@ void LLPanelContents::onClickNewScript(void *userdata)  		// *TODO: The script creation should round-trip back to the  		// viewer so the viewer can auto-open the script and start  		// editing ASAP. -#if 0 -		LLFloaterReg::showInstance("preview_scriptedit", LLSD(inv_item->getUUID()), TAKE_FOCUS_YES); -#endif  	}  } diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 02e05d3d9a..717aece8dd 100755 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -242,6 +242,8 @@ BOOL	LLPanelFace::postBuild()  	if(mShinyColorSwatch)  	{  		mShinyColorSwatch->setCommitCallback(boost::bind(&LLPanelFace::onCommitShinyColor, this, _2)); +		mShinyColorSwatch->setOnCancelCallback(boost::bind(&LLPanelFace::onCancelShinyColor, this, _2)); +		mShinyColorSwatch->setOnSelectCallback(boost::bind(&LLPanelFace::onSelectShinyColor, this, _2));  		mShinyColorSwatch->setFollowsTop();  		mShinyColorSwatch->setFollowsLeft();  		mShinyColorSwatch->setCanApplyImmediately(TRUE); @@ -900,52 +902,22 @@ void LLPanelFace::updateUI()  					getChildView("label maskcutoff")->setEnabled(editable && mIsAlpha);  				}  			} -             -         if (shinytexture_ctrl) -         { -				if (identical_spec && (shiny == SHINY_TEXTURE)) -				{ -					shinytexture_ctrl->setTentative( FALSE ); -					shinytexture_ctrl->setEnabled( editable ); -					shinytexture_ctrl->setImageAssetID( specmap_id ); -					} -            else if (specmap_id.isNull()) -				{ -               shinytexture_ctrl->setTentative( FALSE ); -               shinytexture_ctrl->setEnabled( editable ); -					shinytexture_ctrl->setImageAssetID( LLUUID::null ); -				} -            else -            { -					shinytexture_ctrl->setTentative( TRUE ); -					shinytexture_ctrl->setEnabled( editable ); -					shinytexture_ctrl->setImageAssetID( specmap_id ); + +			if (shinytexture_ctrl) +			{ +				shinytexture_ctrl->setTentative( !identical_spec ); +				shinytexture_ctrl->setEnabled( editable ); +				shinytexture_ctrl->setImageAssetID( specmap_id );  			} -		} -         if (bumpytexture_ctrl) -         { -				if (identical_norm && (bumpy == BUMPY_TEXTURE)) -				{ -					bumpytexture_ctrl->setTentative( FALSE ); -					bumpytexture_ctrl->setEnabled( editable ); -					bumpytexture_ctrl->setImageAssetID( normmap_id ); -				} -				else if (normmap_id.isNull()) -				{ -					bumpytexture_ctrl->setTentative( FALSE ); -					bumpytexture_ctrl->setEnabled( editable ); -					bumpytexture_ctrl->setImageAssetID( LLUUID::null ); -				} -            else -            { -					bumpytexture_ctrl->setTentative( TRUE ); -					bumpytexture_ctrl->setEnabled( editable ); -					bumpytexture_ctrl->setImageAssetID( normmap_id ); -				} +			if (bumpytexture_ctrl) +			{ +				bumpytexture_ctrl->setTentative( !identical_norm ); +				bumpytexture_ctrl->setEnabled( editable ); +				bumpytexture_ctrl->setImageAssetID( normmap_id );  			}  		} -		 +  		// planar align  		bool align_planar = false;  		bool identical_planar_aligned = false; @@ -1463,12 +1435,23 @@ void LLPanelFace::onCancelColor(const LLSD& data)  	LLSelectMgr::getInstance()->selectionRevertColors();  } +void LLPanelFace::onCancelShinyColor(const LLSD& data) +{ +	LLSelectMgr::getInstance()->selectionRevertShinyColors(); +} +  void LLPanelFace::onSelectColor(const LLSD& data)  {  	LLSelectMgr::getInstance()->saveSelectedObjectColors();  	sendColor();  } +void LLPanelFace::onSelectShinyColor(const LLSD& data) +{ +	LLSelectedTEMaterial::setSpecularLightColor(this, getChild<LLColorSwatchCtrl>("shinycolorswatch")->get()); +	LLSelectMgr::getInstance()->saveSelectedShinyColors(); +} +  // static  void LLPanelFace::onCommitMaterialsMedia(LLUICtrl* ctrl, void* userdata)  { diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h index e32f039921..9823e84cd9 100755 --- a/indra/newview/llpanelface.h +++ b/indra/newview/llpanelface.h @@ -143,7 +143,9 @@ protected:  	void 	onCommitShinyColor(const LLSD& data);  	void 	onCommitAlpha(const LLSD& data);  	void 	onCancelColor(const LLSD& data); +	void 	onCancelShinyColor(const LLSD& data);  	void 	onSelectColor(const LLSD& data); +	void 	onSelectShinyColor(const LLSD& data);  	void 	onCloseTexturePicker(const LLSD& data); diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 75a3584a1e..1d73d4bd6e 100755 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -1173,7 +1173,8 @@ bool LLLandmarksPanel::canItemBeModified(const std::string& command_name, LLFold  	if ("copy" == command_name)  	{ -		return root_folder->canCopy(); +		// we shouldn't be able to copy folders from My Inventory Panel +		return can_be_modified && root_folder->canCopy();  	}  	else if ("collapse" == command_name)  	{ diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 6354b5a02b..db944827cd 100755 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -909,6 +909,7 @@ void LLTaskTextureBridge::openItem()  	LLPreviewTexture* preview = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES);  	if(preview)  	{ +		preview->setAuxItem(findItem());  		preview->setObjectID(mPanel->getTaskUUID());  	}  } @@ -1107,7 +1108,10 @@ void LLTaskLSLBridge::openItem()  	}  	if (object->permModify() || gAgent.isGodlike())  	{ -		LLLiveLSLEditor* preview = LLFloaterReg::showTypedInstance<LLLiveLSLEditor>("preview_scriptedit", LLSD(mUUID), TAKE_FOCUS_YES); +		LLSD floater_key; +		floater_key["taskid"] = mPanel->getTaskUUID(); +		floater_key["itemid"] = mUUID; +		LLLiveLSLEditor* preview = LLFloaterReg::showTypedInstance<LLLiveLSLEditor>("preview_scriptedit", floater_key, TAKE_FOCUS_YES);  		if (preview)  		{  			preview->setObjectID(mPanel->getTaskUUID()); diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index 58055d98c6..ce9231d6f2 100755 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -851,6 +851,14 @@ void LLPanelPermissions::refresh()  			combo_click_action->setValue(LLSD(combo_value));  		}  	} + +	if(LLSelectMgr::getInstance()->getSelection()->isAttachment()) +	{ +		getChildView("checkbox for sale")->setEnabled(FALSE); +		getChildView("Edit Cost")->setEnabled(FALSE); +		getChild<LLComboBox>("sale type")->setEnabled(FALSE); +	} +  	getChildView("label click action")->setEnabled(is_perm_modify && is_nonpermanent_enforced  && all_volume);  	getChildView("clickaction")->setEnabled(is_perm_modify && is_nonpermanent_enforced && all_volume);  } diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp index 398f4e6e42..bf2652cb49 100755 --- a/indra/newview/llpreview.cpp +++ b/indra/newview/llpreview.cpp @@ -39,6 +39,7 @@  #include "llradiogroup.h"  #include "llassetstorage.h"  #include "llviewerassettype.h" +#include "llviewermessage.h"  #include "llviewerobject.h"  #include "llviewerobjectlist.h"  #include "lldbstrings.h" @@ -53,7 +54,7 @@  LLPreview::LLPreview(const LLSD& key)  :	LLFloater(key), -	mItemUUID(key.asUUID()), +	mItemUUID(key.has("itemid") ? key.get("itemid").asUUID() : key.asUUID()),  	mObjectUUID(),			// set later by setObjectID()  	mCopyToInvBtn( NULL ),  	mForceClose(FALSE), @@ -369,6 +370,20 @@ void LLPreview::onBtnCopyToInv(void* userdata)  										 self->mNotecardInventoryID,  										 item);  		} +		else if (self->mObjectUUID.notNull()) +		{ +			// item is in in-world inventory +			LLViewerObject* object = gObjectList.findObject(self->mObjectUUID); +			LLPermissions perm(item->getPermissions()); +			if(object +				&&(perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()) +				&& perm.allowTransferTo(gAgent.getID()))) +			{ +				// copy to default folder +				set_dad_inventory_item(item, LLUUID::null); +				object->moveInventory(LLUUID::null, item->getUUID()); +			} +		}  		else  		{  			LLPointer<LLInventoryCallback> cb = NULL; @@ -453,7 +468,6 @@ LLMultiPreview::LLMultiPreview()  	setTitle(LLTrans::getString("MultiPreviewTitle"));  	buildTabContainer();  	setCanResize(TRUE); -	mAutoResize = FALSE;  }  void LLMultiPreview::onOpen(const LLSD& key) diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index a41986373e..92febf6c85 100755 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -1840,7 +1840,8 @@ void LLLiveLSLEditor::loadAsset()  			else if(item && mItem.notNull())  			{  				// request the text from the object -				LLUUID* user_data = new LLUUID(mItemUUID); //  ^ mObjectUUID +				LLSD* user_data = new LLSD(); +				user_data->with("taskid", mObjectUUID).with("itemid", mItemUUID);  				gAssetStorage->getInvItemAsset(object->getRegion()->getHost(),  											   gAgent.getID(),  											   gAgent.getSessionID(), @@ -1917,9 +1918,9 @@ void LLLiveLSLEditor::onLoadComplete(LLVFS *vfs, const LLUUID& asset_id,  {  	LL_DEBUGS() << "LLLiveLSLEditor::onLoadComplete: got uuid " << asset_id  		 << LL_ENDL; -	LLUUID* xored_id = (LLUUID*)user_data; +	LLSD* floater_key = (LLSD*)user_data; -	LLLiveLSLEditor* instance = LLFloaterReg::findTypedInstance<LLLiveLSLEditor>("preview_scriptedit", *xored_id); +	LLLiveLSLEditor* instance = LLFloaterReg::findTypedInstance<LLLiveLSLEditor>("preview_scriptedit", *floater_key);  	if(instance )  	{ @@ -1948,7 +1949,7 @@ void LLLiveLSLEditor::onLoadComplete(LLVFS *vfs, const LLUUID& asset_id,  		}  	} -	delete xored_id; +	delete floater_key;  }  void LLLiveLSLEditor::loadScriptText(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type) @@ -2307,7 +2308,10 @@ void LLLiveLSLEditor::onSaveTextComplete(const LLUUID& asset_uuid, void* user_da  	}  	else  	{ -		LLLiveLSLEditor* self = LLFloaterReg::findTypedInstance<LLLiveLSLEditor>("preview_scriptedit", data->mItem->getUUID()); //  ^ data->mSaveObjectID +		LLSD floater_key; +		floater_key["taskid"] = data->mSaveObjectID; +		floater_key["itemid"] = data->mItem->getUUID(); +		LLLiveLSLEditor* self = LLFloaterReg::findTypedInstance<LLLiveLSLEditor>("preview_scriptedit", floater_key);  		if (self)  		{  			self->getWindow()->decBusyCount(); @@ -2332,7 +2336,10 @@ void LLLiveLSLEditor::onSaveBytecodeComplete(const LLUUID& asset_uuid, void* use  	if(0 ==status)  	{  		LL_INFOS() << "LSL Bytecode saved" << LL_ENDL; -		LLLiveLSLEditor* self = LLFloaterReg::findTypedInstance<LLLiveLSLEditor>("preview_scriptedit", data->mItem->getUUID()); //  ^ data->mSaveObjectID +		LLSD floater_key; +		floater_key["taskid"] = data->mSaveObjectID; +		floater_key["itemid"] = data->mItem->getUUID(); +		LLLiveLSLEditor* self = LLFloaterReg::findTypedInstance<LLLiveLSLEditor>("preview_scriptedit", floater_key);  		if (self)  		{  			// Tell the user that the compile worked. @@ -2410,7 +2417,10 @@ void LLLiveLSLEditor::processScriptRunningReply(LLMessageSystem* msg, void**)  	msg->getUUIDFast(_PREHASH_Script, _PREHASH_ObjectID, object_id);  	msg->getUUIDFast(_PREHASH_Script, _PREHASH_ItemID, item_id); -	LLLiveLSLEditor* instance = LLFloaterReg::findTypedInstance<LLLiveLSLEditor>("preview_scriptedit", item_id); //  ^ object_id +	LLSD floater_key; +	floater_key["taskid"] = object_id; +	floater_key["itemid"] = item_id; +	LLLiveLSLEditor* instance = LLFloaterReg::findTypedInstance<LLLiveLSLEditor>("preview_scriptedit", floater_key);  	if(instance)  	{  		instance->mHaveRunningInfo = TRUE; diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index eb3a4c37d9..b13c30b6d4 100755 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -368,7 +368,7 @@ LLObjectSelectionHandle LLSelectMgr::selectObjectOnly(LLViewerObject* object, S3  //-----------------------------------------------------------------------------  // Select the object, parents and children.  //----------------------------------------------------------------------------- -LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj, BOOL add_to_end) +LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj, BOOL add_to_end, BOOL ignore_select_owned)  {  	llassert( obj ); @@ -385,7 +385,7 @@ LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj,  		return NULL;  	} -	if (!canSelectObject(obj)) +	if (!canSelectObject(obj,ignore_select_owned))  	{  		//make_ui_sound("UISndInvalidOp");  		return NULL; @@ -1766,6 +1766,40 @@ void LLSelectMgr::selectionRevertColors()  	getSelection()->applyToObjects(&sendfunc);  } +void LLSelectMgr::selectionRevertShinyColors() +{ +	struct f : public LLSelectedTEFunctor +	{ +		LLObjectSelectionHandle mSelectedObjects; +		f(LLObjectSelectionHandle sel) : mSelectedObjects(sel) {} +		bool apply(LLViewerObject* object, S32 te) +		{ +			if (object->permModify()) +			{ +				LLSelectNode* nodep = mSelectedObjects->findNode(object); +				if (nodep && te < (S32)nodep->mSavedShinyColors.size()) +				{ +					LLColor4 color = nodep->mSavedShinyColors[te]; +					// update viewer side color in anticipation of update from simulator +					LLMaterialPtr old_mat = object->getTE(te)->getMaterialParams(); +					if (!old_mat.isNull()) +					{ +						LLMaterialPtr new_mat = gFloaterTools->getPanelFace()->createDefaultMaterial(old_mat); +						new_mat->setSpecularLightColor(color); +						object->getTE(te)->setMaterialParams(new_mat); +						LLMaterialMgr::getInstance()->put(object->getID(), te, *new_mat); +					} +				} +			} +			return true; +		} +	} setfunc(mSelectedObjects); +	getSelection()->applyToTEs(&setfunc); + +	LLSelectMgrSendFunctor sendfunc; +	getSelection()->applyToObjects(&sendfunc); +} +  BOOL LLSelectMgr::selectionRevertTextures()  {  	struct f : public LLSelectedTEFunctor @@ -4501,6 +4535,19 @@ void LLSelectMgr::saveSelectedObjectColors()  	getSelection()->applyToNodes(&func);	  } +void LLSelectMgr::saveSelectedShinyColors() +{ +	struct f : public LLSelectedNodeFunctor +	{ +		virtual bool apply(LLSelectNode* node) +		{ +			node->saveShinyColors(); +			return true; +		} +	} func; +	getSelection()->applyToNodes(&func); +} +  void LLSelectMgr::saveSelectedObjectTextures()  {  	// invalidate current selection so we update saved textures @@ -4596,11 +4643,18 @@ struct LLSelectMgrApplyFlags : public LLSelectedObjectFunctor  	BOOL mState;  	virtual bool apply(LLViewerObject* object)  	{ -		if ( object->permModify() &&	// preemptive permissions check -			 object->isRoot()) 		// don't send for child objects +		if ( object->permModify())  		{ -			object->setFlags( mFlags, mState); -		} +			if (object->isRoot()) 		// don't send for child objects +			{ +				object->setFlags( mFlags, mState); +			} +			else if (FLAGS_WORLD & mFlags && ((LLViewerObject*)object->getRoot())->isSelected()) +			{ +				// FLAGS_WORLD are shared by all items in linkset +				object->setFlagsWithoutUpdate(FLAGS_WORLD & mFlags, mState); +			} +		};  		return true;  	}  }; @@ -5752,6 +5806,7 @@ LLSelectNode::LLSelectNode(LLViewerObject* object, BOOL glow)  	mCreationDate(0)  {  	saveColors(); +	saveShinyColors();  }  LLSelectNode::LLSelectNode(const LLSelectNode& nodep) @@ -5797,6 +5852,11 @@ LLSelectNode::LLSelectNode(const LLSelectNode& nodep)  	{  		mSavedColors.push_back(*color_iter);  	} +	mSavedShinyColors.clear(); +	for (color_iter = nodep.mSavedShinyColors.begin(); color_iter != nodep.mSavedShinyColors.end(); ++color_iter) +	{ +		mSavedShinyColors.push_back(*color_iter); +	}  	saveTextures(nodep.mSavedTextures);  } @@ -5880,6 +5940,26 @@ void LLSelectNode::saveColors()  	}  } +void LLSelectNode::saveShinyColors() +{ +	if (mObject.notNull()) +	{ +		mSavedShinyColors.clear(); +		for (S32 i = 0; i < mObject->getNumTEs(); i++) +		{ +			const LLMaterialPtr mat = mObject->getTE(i)->getMaterialParams(); +			if (!mat.isNull()) +			{ +				mSavedShinyColors.push_back(mat->getSpecularLightColor()); +			} +			else +			{ +				mSavedShinyColors.push_back(LLColor4::white); +			} +		} +	} +} +  void LLSelectNode::saveTextures(const uuid_vec_t& textures)  {  	if (mObject.notNull()) @@ -6698,29 +6778,32 @@ void LLSelectMgr::validateSelection()  	getSelection()->applyToObjects(&func);	  } -BOOL LLSelectMgr::canSelectObject(LLViewerObject* object) +BOOL LLSelectMgr::canSelectObject(LLViewerObject* object, BOOL ignore_select_owned)  {  	// Never select dead objects  	if (!object || object->isDead())  	{  		return FALSE;  	} -	 +  	if (mForceSelection)  	{  		return TRUE;  	} -	if ((gSavedSettings.getBOOL("SelectOwnedOnly") && !object->permYouOwner()) || -		(gSavedSettings.getBOOL("SelectMovableOnly") && (!object->permMove() ||  object->isPermanentEnforced()))) +	if(!ignore_select_owned)  	{ -		// only select my own objects -		return FALSE; +		if ((gSavedSettings.getBOOL("SelectOwnedOnly") && !object->permYouOwner()) || +				(gSavedSettings.getBOOL("SelectMovableOnly") && (!object->permMove() ||  object->isPermanentEnforced()))) +		{ +			// only select my own objects +			return FALSE; +		}  	}  	// Can't select orphans  	if (object->isOrphaned()) return FALSE; -	 +  	// Can't select avatars  	if (object->isAvatar()) return FALSE; diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index a68328167a..23c41e4cc1 100755 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -179,6 +179,7 @@ public:  	void setObject(LLViewerObject* object);  	// *NOTE: invalidate stored textures and colors when # faces change  	void saveColors(); +	void saveShinyColors();  	void saveTextures(const uuid_vec_t& textures);  	void saveTextureScaleRatios(LLRender::eTexIndex index_to_query); @@ -215,6 +216,7 @@ public:  	std::string		mSitName;  	U64				mCreationDate;  	std::vector<LLColor4>	mSavedColors; +	std::vector<LLColor4>	mSavedShinyColors;  	uuid_vec_t		mSavedTextures;  	std::vector<LLVector3>  mTextureScaleRatios;  	std::vector<LLVector3>	mSilhouetteVertices;	// array of vertices to render silhouette of object @@ -452,7 +454,7 @@ public:  	//  	// *NOTE: You must hold on to the object selection handle, otherwise  	// the objects will be automatically deselected in 1 frame. -	LLObjectSelectionHandle selectObjectAndFamily(LLViewerObject* object, BOOL add_to_end = FALSE); +	LLObjectSelectionHandle selectObjectAndFamily(LLViewerObject* object, BOOL add_to_end = FALSE, BOOL ignore_select_owned = FALSE);  	// For when you want just a child object.  	LLObjectSelectionHandle selectObjectOnly(LLViewerObject* object, S32 face = SELECT_ALL_TES); @@ -545,6 +547,7 @@ public:  	////////////////////////////////////////////////////////////////  	void saveSelectedObjectTransform(EActionType action_type);  	void saveSelectedObjectColors(); +	void saveSelectedShinyColors();  	void saveSelectedObjectTextures();  	// Sets which texture channel to query for scale and rot of display @@ -573,6 +576,7 @@ public:  	void selectionSetColorOnly(const LLColor4 &color); // Set only the RGB channels  	void selectionSetAlphaOnly(const F32 alpha); // Set only the alpha channel  	void selectionRevertColors(); +	void selectionRevertShinyColors();  	BOOL selectionRevertTextures();  	void selectionSetBumpmap( U8 bumpmap );  	void selectionSetTexGen( U8 texgen ); @@ -605,7 +609,7 @@ public:  	void validateSelection();  	// returns TRUE if it is possible to select this object -	BOOL canSelectObject(LLViewerObject* object); +	BOOL canSelectObject(LLViewerObject* object, BOOL ignore_select_owned = FALSE);  	// Returns TRUE if the viewer has information on all selected objects  	BOOL selectGetAllRootsValid(); diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index 1d20b7bed5..126f1fb9de 100755 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -32,6 +32,7 @@  #include "llagent.h"  #include "llavataractions.h"  #include "llbutton.h" +#include "llcombobox.h"  #include "llfloaterreg.h"  #include "llgroupactions.h"  #include "llinventorydefines.h" @@ -173,6 +174,8 @@ BOOL LLSidepanelItemInfo::postBuild()  	getChild<LLUICtrl>("CheckNextOwnerTransfer")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitPermissions, this));  	// Mark for sale or not, and sale info  	getChild<LLUICtrl>("CheckPurchase")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this)); +	// Change sale type, and sale info +	getChild<LLUICtrl>("ComboBoxSaleType")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this));  	// "Price" label for edit  	getChild<LLUICtrl>("Edit Cost")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitSaleInfo, this));  	refresh(); @@ -435,7 +438,7 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)  		"CheckNextOwnerTransfer",  		"CheckPurchase",  		"SaleLabel", -		"combobox sale copy", +		"ComboBoxSaleType",  		"Edit Cost",  		"TextPrice"  	}; @@ -617,6 +620,9 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)  	const LLSaleInfo& sale_info = item->getSaleInfo();  	BOOL is_for_sale = sale_info.isForSale(); +	LLComboBox* combo_sale_type = getChild<LLComboBox>("ComboBoxSaleType"); +	LLUICtrl* edit_cost = getChild<LLUICtrl>("Edit Cost"); +  	// Check for ability to change values.  	if (is_obj_modify && can_agent_sell   		&& gAgent.allowOperation(PERM_TRANSFER, perm, GP_OBJECT_MANIPULATE)) @@ -630,7 +636,8 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)  		getChildView("CheckNextOwnerTransfer")->setEnabled((next_owner_mask & PERM_COPY) && !cannot_restrict_permissions);  		getChildView("TextPrice")->setEnabled(is_complete && is_for_sale); -		getChildView("Edit Cost")->setEnabled(is_complete && is_for_sale); +		combo_sale_type->setEnabled(is_complete && is_for_sale); +		edit_cost->setEnabled(is_complete && is_for_sale);  	}  	else  	{ @@ -643,13 +650,12 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)  		getChildView("CheckNextOwnerTransfer")->setEnabled(FALSE);  		getChildView("TextPrice")->setEnabled(FALSE); -		getChildView("Edit Cost")->setEnabled(FALSE); +		combo_sale_type->setEnabled(FALSE); +		edit_cost->setEnabled(FALSE);  	}  	// Set values.  	getChild<LLUICtrl>("CheckPurchase")->setValue(is_for_sale); -	getChildView("combobox sale copy")->setEnabled(is_for_sale); -	getChildView("Edit Cost")->setEnabled(is_for_sale);  	getChild<LLUICtrl>("CheckNextOwnerModify")->setValue(LLSD(BOOL(next_owner_mask & PERM_MODIFY)));  	getChild<LLUICtrl>("CheckNextOwnerCopy")->setValue(LLSD(BOOL(next_owner_mask & PERM_COPY)));  	getChild<LLUICtrl>("CheckNextOwnerTransfer")->setValue(LLSD(BOOL(next_owner_mask & PERM_TRANSFER))); @@ -658,11 +664,13 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)  	{  		S32 numerical_price;  		numerical_price = sale_info.getSalePrice(); -		getChild<LLUICtrl>("Edit Cost")->setValue(llformat("%d",numerical_price)); +		edit_cost->setValue(llformat("%d",numerical_price)); +		combo_sale_type->setValue(sale_info.getSaleType());  	}  	else  	{ -		getChild<LLUICtrl>("Edit Cost")->setValue(llformat("%d",0)); +		edit_cost->setValue(llformat("%d",0)); +		combo_sale_type->setValue(LLSaleInfo::FS_COPY);  	}  } @@ -918,24 +926,10 @@ void LLSidepanelItemInfo::updateSaleInfo()  		// turn on sale info  		LLSaleInfo::EForSale sale_type = LLSaleInfo::FS_COPY; -		LLRadioGroup* RadioSaleType = getChild<LLRadioGroup>("RadioSaleType"); -		if(RadioSaleType) +		LLComboBox* combo_sale_type = getChild<LLComboBox>("ComboBoxSaleType"); +		if (combo_sale_type)  		{ -			switch (RadioSaleType->getSelectedIndex()) -			{ -			case 0: -				sale_type = LLSaleInfo::FS_ORIGINAL; -				break; -			case 1: -				sale_type = LLSaleInfo::FS_COPY; -				break; -			case 2: -				sale_type = LLSaleInfo::FS_CONTENTS; -				break; -			default: -				sale_type = LLSaleInfo::FS_COPY; -				break; -			} +			sale_type = static_cast<LLSaleInfo::EForSale>(combo_sale_type->getValue().asInteger());  		}  		if (sale_type == LLSaleInfo::FS_COPY  diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp index 636654ad23..17ecfab4fb 100755 --- a/indra/newview/llsidepaneltaskinfo.cpp +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -499,17 +499,19 @@ void LLSidepanelTaskInfo::refresh()  	// You own these objects.  	else if (self_owned || (group_owned && gAgent.hasPowerInGroup(group_id,GP_OBJECT_SET_SALE)))  	{ +		LLSpinCtrl *edit_price = getChild<LLSpinCtrl>("Edit Cost"); +  		// If there are multiple items for sale then set text to PRICE PER UNIT.  		if (num_for_sale > 1)  		{ -			getChild<LLUICtrl>("Cost")->setValue(getString("Cost Per Unit")); +			std::string label_text = is_sale_price_mixed? "Cost Mixed" :"Cost Per Unit"; +			edit_price->setLabel(getString(label_text));  		}  		else  		{ -			getChild<LLUICtrl>("Cost")->setValue(getString("Cost Default")); +			edit_price->setLabel(getString("Cost Default"));  		} -		LLSpinCtrl *edit_price = getChild<LLSpinCtrl>("Edit Cost");  		if (!edit_price->hasFocus())  		{  			// If the sale price is mixed then set the cost to MIXED, otherwise @@ -547,16 +549,15 @@ void LLSidepanelTaskInfo::refresh()  		// If multiple items are for sale, set text to TOTAL PRICE.  		if (num_for_sale > 1) -			getChild<LLUICtrl>("Cost")->setValue(getString("Cost Total")); +			getChild<LLSpinCtrl>("Edit Cost")->setLabel(getString("Cost Total"));  		else -			getChild<LLUICtrl>("Cost")->setValue(getString("Cost Default")); +			getChild<LLSpinCtrl>("Edit Cost")->setLabel(getString("Cost Default"));  	}  	// This is a public object.  	else  	{  		getChildView("Cost")->setEnabled(FALSE); -		getChild<LLUICtrl>("Cost")->setValue(getString("Cost Default")); -		 +		getChild<LLSpinCtrl>("Edit Cost")->setLabel(getString("Cost Default"));  		getChild<LLUICtrl>("Edit Cost")->setValue(LLStringUtil::null);  		getChildView("Edit Cost")->setEnabled(FALSE);  	} diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index e80756e4de..7867e1573c 100755 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -611,11 +611,14 @@ void LLSpeakerMgr::updateSpeakerList()  	setSpeaker(gAgentID, "", LLSpeaker::STATUS_VOICE_ACTIVE, LLSpeaker::SPEAKER_AGENT);  } -void LLSpeakerMgr::setSpeakerNotInChannel(LLSpeaker* speakerp) +void LLSpeakerMgr::setSpeakerNotInChannel(LLPointer<LLSpeaker> speakerp)  { -	speakerp->mStatus = LLSpeaker::STATUS_NOT_IN_CHANNEL; -	speakerp->mDotColor = INACTIVE_COLOR; -	mSpeakerDelayRemover->setActionTimer(speakerp->mID); +	if  (speakerp.notNull()) +	{ +		speakerp->mStatus = LLSpeaker::STATUS_NOT_IN_CHANNEL; +		speakerp->mDotColor = INACTIVE_COLOR; +		mSpeakerDelayRemover->setActionTimer(speakerp->mID); +	}  }  bool LLSpeakerMgr::removeSpeaker(const LLUUID& speaker_id) @@ -795,7 +798,7 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)  			if (agent_data.isMap() && agent_data.has("transition"))  			{ -				if (agent_data["transition"].asString() == "LEAVE" && speakerp.notNull()) +				if (agent_data["transition"].asString() == "LEAVE")  				{  					setSpeakerNotInChannel(speakerp);  				} @@ -806,7 +809,7 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)  				}  				else  				{ -					LL_WARNS() << "bad membership list update " << ll_print_sd(agent_data["transition"]) << LL_ENDL; +					LL_WARNS() << "bad membership list update from 'agent_updates' for agent " << agent_id << ", transition " << ll_print_sd(agent_data["transition"]) << LL_ENDL;  				}  			} @@ -848,7 +851,7 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)  			LLPointer<LLSpeaker> speakerp = findSpeaker(agent_id);  			std::string agent_transition = update_it->second.asString(); -			if (agent_transition == "LEAVE" && speakerp.notNull()) +			if (agent_transition == "LEAVE")  			{  				setSpeakerNotInChannel(speakerp);  			} @@ -859,8 +862,7 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)  			}  			else  			{ -				LL_WARNS() << "bad membership list update " -						<< agent_transition << LL_ENDL; +				LL_WARNS() << "bad membership list update from 'updates' for agent " << agent_id << ", transition " << agent_transition << LL_ENDL;  			}  		}  	} @@ -1041,8 +1043,8 @@ void LLLocalSpeakerMgr::updateSpeakerList()  	for (speaker_map_t::iterator speaker_it = mSpeakers.begin(); speaker_it != mSpeakers.end(); ++speaker_it)  	{  		LLUUID speaker_id = speaker_it->first; -		LLSpeaker* speakerp = speaker_it->second; -		if (speakerp->mStatus == LLSpeaker::STATUS_TEXT_ONLY) +		LLPointer<LLSpeaker> speakerp = speaker_it->second; +		if (speakerp.notNull() && speakerp->mStatus == LLSpeaker::STATUS_TEXT_ONLY)  		{  			LLVOAvatar* avatarp = (LLVOAvatar*)gObjectList.findObject(speaker_id);  			if (!avatarp || dist_vec_squared(avatarp->getPositionAgent(), gAgent.getPositionAgent()) > CHAT_NORMAL_RADIUS * CHAT_NORMAL_RADIUS) diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h index e953dd0e1a..0e69184125 100755 --- a/indra/newview/llspeakers.h +++ b/indra/newview/llspeakers.h @@ -258,7 +258,7 @@ public:  protected:  	virtual void updateSpeakerList(); -	void setSpeakerNotInChannel(LLSpeaker* speackerp); +	void setSpeakerNotInChannel(LLPointer<LLSpeaker> speackerp);  	bool removeSpeaker(const LLUUID& speaker_id);  	typedef std::map<LLUUID, LLPointer<LLSpeaker> > speaker_map_t; diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index a426669b5e..374c18b30d 100755 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -586,9 +586,9 @@ void LLFloaterTexturePicker::draw()  			mTentativeLabel->setVisible( FALSE  );  		} -		getChildView("Default")->setEnabled(mImageAssetID != mOwner->getDefaultImageAssetID()); -		getChildView("Blank")->setEnabled(mImageAssetID != mOwner->getBlankImageAssetID()); -		getChildView("None")->setEnabled(mOwner->getAllowNoTexture() && !mImageAssetID.isNull() ); +		getChildView("Default")->setEnabled(mImageAssetID != mOwner->getDefaultImageAssetID() || mOwner->getTentative()); +		getChildView("Blank")->setEnabled(mImageAssetID != mOwner->getBlankImageAssetID() || mOwner->getTentative()); +		getChildView("None")->setEnabled(mOwner->getAllowNoTexture() && (!mImageAssetID.isNull() || mOwner->getTentative()));  		LLFloater::draw(); @@ -1511,8 +1511,8 @@ void LLTextureCtrl::draw()  		gl_draw_x( interior, LLColor4::black );  	} -	mTentativeLabel->setVisible( !mTexturep.isNull() && getTentative() ); -	 +	mTentativeLabel->setVisible( getTentative() ); +  	// Show "Loading..." string on the top left corner while this texture is loading.  	// Using the discard level, do not show the string if the texture is almost but not   	// fully loaded. diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp index 58073d1186..c12c106b8b 100755 --- a/indra/newview/lltoolfocus.cpp +++ b/indra/newview/lltoolfocus.cpp @@ -136,7 +136,7 @@ BOOL LLToolCamera::handleMouseDown(S32 x, S32 y, MASK mask)  	gViewerWindow->hideCursor(); -	gViewerWindow->pickAsync(x, y, mask, pickCallback); +	gViewerWindow->pickAsync(x, y, mask, pickCallback, FALSE, TRUE);  	return TRUE;  } diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 981e4c40aa..dfbb128d3b 100755 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -1344,6 +1344,14 @@ void swap()  	gDisplaySwapBuffers = TRUE;  } +void restoreGLContext() +{ +	if(gViewerWindow && gViewerWindow->getWindow())  +	{ +		gViewerWindow->getWindow()->restoreGLContext(); +	} +} +  void renderCoordinateAxes()  {  	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); diff --git a/indra/newview/llviewerdisplay.h b/indra/newview/llviewerdisplay.h index f6467d7f93..dcc78fe42f 100755 --- a/indra/newview/llviewerdisplay.h +++ b/indra/newview/llviewerdisplay.h @@ -34,6 +34,8 @@ void display_cleanup();  void display(BOOL rebuild = TRUE, F32 zoom_factor = 1.f, int subfield = 0, BOOL for_snapshot = FALSE); +void restoreGLContext(); +  extern BOOL gDisplaySwapBuffers;  extern BOOL gDepthDirty;  extern BOOL	gTeleportDisplay; diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index a4a05587d3..35b55029cc 100755 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -320,8 +320,8 @@ void camera_spin_around_cw( EKeystate s )  void camera_spin_around_ccw_sitting( EKeystate s )  { -	if( KEYSTATE_UP == s ) return; -	if (gAgent.rotateGrabbed() || gAgentCamera.sitCameraEnabled()) +	if( KEYSTATE_UP == s && gAgent.mDoubleTapRunMode != LLAgent::DOUBLETAP_SLIDERIGHT ) return; +	if (gAgent.rotateGrabbed() || gAgentCamera.sitCameraEnabled() || gAgent.getRunning())  	{  		//send keystrokes, but do not change camera  		agent_turn_right(s); @@ -336,8 +336,8 @@ void camera_spin_around_ccw_sitting( EKeystate s )  void camera_spin_around_cw_sitting( EKeystate s )  { -	if( KEYSTATE_UP == s  ) return; -	if (gAgent.rotateGrabbed() || gAgentCamera.sitCameraEnabled()) +	if( KEYSTATE_UP == s && gAgent.mDoubleTapRunMode != LLAgent::DOUBLETAP_SLIDELEFT ) return; +	if (gAgent.rotateGrabbed() || gAgentCamera.sitCameraEnabled() || gAgent.getRunning())  	{  		//send keystrokes, but do not change camera  		agent_turn_left(s); @@ -413,8 +413,8 @@ void camera_move_backward( EKeystate s )  void camera_move_forward_sitting( EKeystate s )  { -	if( KEYSTATE_UP == s  ) return; -	if (gAgent.forwardGrabbed() || gAgentCamera.sitCameraEnabled()) +	if( KEYSTATE_UP == s && gAgent.mDoubleTapRunMode != LLAgent::DOUBLETAP_FORWARD ) return; +	if (gAgent.forwardGrabbed() || gAgentCamera.sitCameraEnabled() || gAgent.getRunning())  	{  		agent_push_forward(s);  	} @@ -427,9 +427,9 @@ void camera_move_forward_sitting( EKeystate s )  void camera_move_backward_sitting( EKeystate s )  { -	if( KEYSTATE_UP == s  ) return; +	if( KEYSTATE_UP == s && gAgent.mDoubleTapRunMode != LLAgent::DOUBLETAP_BACKWARD ) return; -	if (gAgent.backwardGrabbed() || gAgentCamera.sitCameraEnabled()) +	if (gAgent.backwardGrabbed() || gAgentCamera.sitCameraEnabled() || gAgent.getRunning())  	{  		agent_push_backward(s);  	} diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index be9b4439a8..c76e4ca46d 100755 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -2580,9 +2580,13 @@ static LLStringExplicit get_default_item_label(const std::string& item_name)  bool enable_object_touch(LLUICtrl* ctrl)  { +	bool new_value = false;  	LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); - -	bool new_value = obj && obj->flagHandleTouch(); +	if (obj) +	{ +		LLViewerObject* parent = (LLViewerObject*)obj->getParent(); +		new_value = obj->flagHandleTouch() || (parent && parent->flagHandleTouch()); +	}  	std::string item_name = ctrl->getName();  	init_default_item_label(item_name); diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 74b8e693c4..87424cd584 100755 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3374,8 +3374,17 @@ void LLViewerObject::setLinksetCost(F32 cost)  {  	mLinksetCost = cost;  	mCostStale = false; -	 -	if (isSelected()) + +	BOOL needs_refresh = isSelected(); +	child_list_t::iterator iter = mChildList.begin(); +	while(iter != mChildList.end() && !needs_refresh) +	{ +		LLViewerObject* child = *iter; +		needs_refresh = child->isSelected(); +		iter++; +	} + +	if (needs_refresh)  	{  		gFloaterTools->dirty();  	} diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 2f4365036c..d574dec11d 100755 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -705,7 +705,7 @@ bool LLViewerParcelMgr::allowAgentScripts(const LLViewerRegion* region, const LL  bool LLViewerParcelMgr::allowAgentDamage(const LLViewerRegion* region, const LLParcel* parcel) const  {  	return (region && region->getAllowDamage()) -		|| (parcel && parcel->getAllowDamage()); +		&& (parcel && parcel->getAllowDamage());  }  BOOL LLViewerParcelMgr::isOwnedAt(const LLVector3d& pos_global) const diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index b98726900f..322a55383a 100755 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -622,7 +622,7 @@ void LLViewerTextureList::addImage(LLViewerFetchedTexture *new_image)  	{  		return;  	} -	llassert(new_image); +	//llassert(new_image);  	LLUUID image_id = new_image->getID();  	LLViewerFetchedTexture *image = findImage(image_id); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 9dcd0b81e0..756248a356 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -3757,7 +3757,12 @@ BOOL LLViewerWindow::clickPointOnSurfaceGlobal(const S32 x, const S32 y, LLViewe  	return intersect;  } -void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& info), BOOL pick_transparent) +void LLViewerWindow::pickAsync( S32 x, +								S32 y_from_bot, +								MASK mask, +								void (*callback)(const LLPickInfo& info), +								BOOL pick_transparent, +								BOOL pick_unselectable)  {  	BOOL in_build_mode = LLFloaterReg::instanceVisible("build");  	if (in_build_mode || LLDrawPoolAlpha::sShowDebugAlpha) @@ -3767,7 +3772,7 @@ void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback  		pick_transparent = TRUE;  	} -	LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, FALSE, TRUE, callback); +	LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, FALSE, TRUE, pick_unselectable, callback);  	schedulePick(pick_info);  } @@ -3835,7 +3840,7 @@ LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot,  BOOL pick_trans  	// shortcut queueing in mPicks and just update mLastPick in place  	MASK	key_mask = gKeyboard->currentMask(TRUE); -	mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, pick_particle, TRUE, NULL); +	mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, pick_particle, TRUE, FALSE, NULL);  	mLastPick.fetchResults();  	return mLastPick; @@ -4084,7 +4089,7 @@ BOOL LLViewerWindow::mousePointOnPlaneGlobal(LLVector3d& point, const S32 x, con  // Returns global position -BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d *land_position_global) +BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d *land_position_global, BOOL ignore_distance)  {  	LLVector3		mouse_direction_global = mouseDirectionGlobal(x,y);  	F32				mouse_dir_scale; @@ -4093,6 +4098,7 @@ BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d  	F32			land_z;  	const F32	FIRST_PASS_STEP = 1.0f;		// meters  	const F32	SECOND_PASS_STEP = 0.1f;	// meters +	const F32	draw_distance = ignore_distance ? MAX_FAR_CLIP : gAgentCamera.mDrawDistance;  	LLVector3d	camera_pos_global;  	camera_pos_global = gAgentCamera.getCameraPositionGlobal(); @@ -4100,7 +4106,7 @@ BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d  	LLVector3		probe_point_region;  	// walk forwards to find the point -	for (mouse_dir_scale = FIRST_PASS_STEP; mouse_dir_scale < gAgentCamera.mDrawDistance; mouse_dir_scale += FIRST_PASS_STEP) +	for (mouse_dir_scale = FIRST_PASS_STEP; mouse_dir_scale < draw_distance; mouse_dir_scale += FIRST_PASS_STEP)  	{  		LLVector3d mouse_direction_global_d;  		mouse_direction_global_d.setVec(mouse_direction_global * mouse_dir_scale); @@ -5247,6 +5253,7 @@ LLPickInfo::LLPickInfo(const LLCoordGL& mouse_pos,  		       BOOL pick_transparent,  			   BOOL pick_particle,  		       BOOL pick_uv_coords, +			   BOOL pick_unselectable,  		       void (*pick_callback)(const LLPickInfo& pick_info))  	: mMousePt(mouse_pos),  	  mKeyMask(keyboard_mask), @@ -5262,7 +5269,8 @@ LLPickInfo::LLPickInfo(const LLCoordGL& mouse_pos,  	  mBinormal(),  	  mHUDIcon(NULL),  	  mPickTransparent(pick_transparent), -	  mPickParticle(pick_particle) +	  mPickParticle(pick_particle), +	  mPickUnselectable(pick_unselectable)  {  } @@ -5337,7 +5345,7 @@ void LLPickInfo::fetchResults()  			// put global position into land_pos  			LLVector3d land_pos; -			if (!gViewerWindow->mousePointOnLandGlobal(mPickPt.mX, mPickPt.mY, &land_pos)) +			if (!gViewerWindow->mousePointOnLandGlobal(mPickPt.mX, mPickPt.mY, &land_pos, mPickUnselectable))  			{  				// The selected point is beyond the draw distance or is otherwise   				// not selectable. Return before calling mPickCallback(). diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 5d2df2dfd7..7fde52d4e1 100755 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -91,6 +91,7 @@ public:  		BOOL pick_transparent,  		BOOL pick_particle,  		BOOL pick_surface_info, +		BOOL pick_unselectable,  		void (*pick_callback)(const LLPickInfo& pick_info));  	void fetchResults(); @@ -123,6 +124,7 @@ public:  	LLVector3		mBinormal;  	BOOL			mPickTransparent;  	BOOL			mPickParticle; +	BOOL			mPickUnselectable;  	void		    getSurfaceInfo();  private: @@ -360,7 +362,12 @@ public:  	void			performPick();  	void			returnEmptyPicks(); -	void			pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& pick_info), BOOL pick_transparent = FALSE); +	void			pickAsync(	S32 x, +								S32 y_from_bot, +								MASK mask, +								void (*callback)(const LLPickInfo& pick_info), +								BOOL pick_transparent = FALSE, +								BOOL pick_unselectable = FALSE);  	LLPickInfo		pickImmediate(S32 x, S32 y, BOOL pick_transparent, BOOL pick_particle = FALSE);  	LLHUDIcon* cursorIntersectIcon(S32 mouse_x, S32 mouse_y, F32 depth,  										   LLVector4a* intersection); @@ -386,7 +393,7 @@ public:  	//const LLVector3d& lastNonFloraObjectHitOffset();  	// mousePointOnLand() returns true if found point -	BOOL			mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d *land_pos_global); +	BOOL			mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d *land_pos_global, BOOL ignore_distance = FALSE);  	BOOL			mousePointOnPlaneGlobal(LLVector3d& point, const S32 x, const S32 y, const LLVector3d &plane_point, const LLVector3 &plane_normal);  	LLVector3d		clickPointInWorldGlobal(const S32 x, const S32 y_from_bot, LLViewerObject* clicked_object) const;  	BOOL			clickPointOnSurfaceGlobal(const S32 x, const S32 y, LLViewerObject *objectp, LLVector3d &point_global) const; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 66ee386874..008ef792e0 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -2040,19 +2040,32 @@ S32 LLVOVolume::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID)  S32 LLVOVolume::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams)  { -	S32 res = 0; -	 -	if (pMaterialParams && getTEImage(te) && 3 == getTEImage(te)->getComponents() && pMaterialParams->getDiffuseAlphaMode())  -	{ -		LLViewerObject::setTEMaterialID(te, LLMaterialID::null); -		res = LLViewerObject::setTEMaterialParams(te, NULL); -	} -	else  +	LLMaterialPtr pMaterial = const_cast<LLMaterialPtr&>(pMaterialParams); + +	if(pMaterialParams)  	{ -		res = LLViewerObject::setTEMaterialParams(te, pMaterialParams); +		LLViewerTexture* image = getTEImage(te); +		LLGLenum image_format = image ? image->getPrimaryFormat() : GL_RGB; +		LLMaterialPtr current_material = getTEMaterialParams(te); + +		U8 new_diffuse_alpha_mode = pMaterialParams->getDiffuseAlphaMode(); + +		if(new_diffuse_alpha_mode == LLMaterial::DIFFUSE_ALPHA_MODE_BLEND) +		{ +			new_diffuse_alpha_mode = (GL_RGB == image_format || 0 == image_format ? LLMaterial::DIFFUSE_ALPHA_MODE_NONE : new_diffuse_alpha_mode); +		} + +		if(pMaterialParams->getDiffuseAlphaMode() != new_diffuse_alpha_mode) { +			//create new material +			pMaterial = new LLMaterial(pMaterialParams->asLLSD()); +			pMaterial->setDiffuseAlphaMode(new_diffuse_alpha_mode); +			LLMaterialMgr::getInstance()->put(getID(),te,*pMaterial); +		}  	} -	LL_DEBUGS("MaterialTEs") << "te " << (S32)te << " material " << ((pMaterialParams) ? pMaterialParams->asLLSD() : LLSD("null")) << " res " << res +	S32 res = LLViewerObject::setTEMaterialParams(te, pMaterial); + +	LL_DEBUGS("MaterialTEs") << "te " << (S32)te << " material " << ((pMaterial) ? pMaterial->asLLSD() : LLSD("null")) << " res " << res  							 << ( LLSelectMgr::getInstance()->getSelection()->contains(const_cast<LLVOVolume*>(this), te) ? " selected" : " not selected" )  							 << LL_ENDL;  	setChanged(ALL_CHANGED); diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index b4e8114a5f..315af3f942 100755 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -796,9 +796,12 @@ void LLWorld::updateNetStats()  	add(LLStatViewer::PACKETS_IN, packets_in);  	add(LLStatViewer::PACKETS_OUT, packets_out);  	add(LLStatViewer::PACKETS_LOST, packets_lost); -	if (packets_in) + +	F32 total_packets_in = LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_IN); +	if (total_packets_in > 0)  	{ -		sample(LLStatViewer::PACKETS_LOST_PERCENT, LLUnits::Ratio::fromValue((F32)packets_lost/(F32)packets_in)); +		F32 total_packets_lost = LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_LOST); +		sample(LLStatViewer::PACKETS_LOST_PERCENT, LLUnits::Ratio::fromValue((F32)total_packets_lost/(F32)total_packets_in));  	}  	mLastPacketsIn = gMessageSystem->mPacketsIn; diff --git a/indra/newview/skins/default/xui/da/menu_viewer.xml b/indra/newview/skins/default/xui/da/menu_viewer.xml index f2ed7c2e64..aa6bc53672 100755 --- a/indra/newview/skins/default/xui/da/menu_viewer.xml +++ b/indra/newview/skins/default/xui/da/menu_viewer.xml @@ -128,6 +128,7 @@  		<menu_item_check label="Aktiver tips" name="Enable Hints"/>  		<menu_item_call label="Rapporter misbrug" name="Report Abuse"/>  		<menu_item_call label="Rapportér fejl" name="Report Bug"/> +		<menu_item_call label="Stød, skub & slag" name="Bumps, Pushes &amp; Hits"/>  		<menu_item_call label="Om [APP_NAME]" name="About Second Life"/>  	</menu>  	<menu label="Avanceret" name="Advanced"> @@ -261,8 +262,7 @@  		<menu label="Netværk" name="Network">  			<menu_item_check label="Pause avatar" name="AgentPause"/>  			<menu_item_call label="Mist en netværkspakke" name="Drop a Packet"/> -		</menu> -		<menu_item_call label="Stød, skub & slag" name="Bumps, Pushes &amp; Hits"/> +		</menu>		  		<menu label="Verden" name="DevelopWorld">  			<menu_item_check label="Vælg anden sol end region" name="Sim Sun Override"/>  			<menu_item_check label="Fast vejr" name="Fixed Weather"/> diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml index c9fad9c9d3..50a6dafa91 100755 --- a/indra/newview/skins/default/xui/de/menu_viewer.xml +++ b/indra/newview/skins/default/xui/de/menu_viewer.xml @@ -176,6 +176,7 @@  		<menu_item_call label="[SECOND_LIFE]-Blogs" name="Second Life Blogs"/>  		<menu_item_call label="Missbrauch melden" name="Report Abuse"/>  		<menu_item_call label="Fehler melden" name="Report Bug"/> +		<menu_item_call label="Rempler, Stöße & Schläge" name="Bumps, Pushes &amp; Hits"/>  		<menu_item_call label="INFO ÜBER [APP_NAME]" name="About Second Life"/>  	</menu>  	<menu label="Erweitert" name="Advanced"> @@ -352,8 +353,7 @@  			<menu_item_check label="Positionen der interpolierten Objekte anfragen" name="Ping Interpolate Object Positions"/>  			<menu_item_call label="Ein Paket fallenlassen" name="Drop a Packet"/>  		</menu> -		<menu_item_call label="Geskriptete Kamera ausgeben" name="Dump Scripted Camera"/> -		<menu_item_call label="Rempler, Stöße & Schläge" name="Bumps, Pushes &amp; Hits"/> +		<menu_item_call label="Geskriptete Kamera ausgeben" name="Dump Scripted Camera"/>		  		<menu label="Rekorder" name="Recorder">  			<menu_item_call label="Wiedergabe starten" name="Start Playback"/>  			<menu_item_call label="Wiedergabe stoppen" name="Stop Playback"/> diff --git a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml index adef066aef..6667238232 100755 --- a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml @@ -304,16 +304,20 @@       left_pad="5"       layout="topleft"       follows="left|top" -     name="combobox sale copy" +     name="ComboBoxSaleType"       width="110"> -        <combo_box.item -         label="Copy" +       <combo_box.item           name="Copy" -         value="Copy" /> -        <combo_box.item -         label="Original" +         label="Copy" +         value="2" /> +       <combo_box.item +         name="Contents" +         label="Contents" +         value="3" /> +       <combo_box.item           name="Original" -         value="Original" /> +         label="Original" +         value="1" />      </combo_box>      <spinner          follows="left|top" @@ -427,34 +431,6 @@          Mark Item:      </text--> - -    <!--radio_group -     draw_border="false" -     follows="left|top|right" -     height="16" -     layout="topleft" -     left_delta="78" -     name="RadioSaleType" -     top_delta="0" -     width="252"> -        <radio_item -         height="16" -         label="Original" -         layout="topleft" -         left="0" -         name="radio" -         top="0" -         width="70" /> -        <radio_item -         height="16" -         label="Copy" -         layout="topleft" -         left_delta="60" -         name="radio2" -         top_delta="0" -         width="70" /> -    </radio_group--> -      <!--text       type="string"       length="1" diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml index 8baa0a56f7..c4ac936334 100755 --- a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml @@ -2,10 +2,12 @@  <floater   legacy_header_height="18"   height="460" + min_height="460"   layout="topleft"   name="gesture_preview"   help_topic="gesture_preview" - width="280"> + width="280" + min_width="280">      <floater.string       name="step_anim">          Animation to play: diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml index 2aa582beea..90f9591f29 100755 --- a/indra/newview/skins/default/xui/en/floater_stats.xml +++ b/indra/newview/skins/default/xui/en/floater_stats.xml @@ -41,6 +41,7 @@                    show_bar="true"/>          <stat_bar name="packet_loss"                    label="Packet Loss" +                  decimal_digits="1"                    stat="packetslostpercentstat"/>          <stat_bar name="ping"                    label="Ping Sim" diff --git a/indra/newview/skins/default/xui/en/menu_avatar_other.xml b/indra/newview/skins/default/xui/en/menu_avatar_other.xml index 8bd013f14b..cfbbe41f95 100755 --- a/indra/newview/skins/default/xui/en/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_other.xml @@ -96,14 +96,11 @@             function="Tools.LookAtSelection"             parameter="zoom" />      </menu_item_call> -   <menu_item_call -     enabled="false" +   <menu_item_call           label="Pay"       name="Pay...">          <menu_item_call.on_click -         function="PayObject" /> -        <menu_item_call.on_enable -         function="EnablePayAvatar" /> +         function="PayObject" />             </menu_item_call>     <menu_item_separator /> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 560f81a6fd..658c716ee7 100755 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -1417,7 +1417,14 @@              </menu_item_call>          <menu_item_separator/> - +		<menu_item_call +             label="Bumps, Pushes & Hits" +             name="Bumps, Pushes &amp; Hits"> +                <menu_item_call.on_click +                 function="Floater.Show" +                 parameter="bumps" /> +        </menu_item_call> +        <menu_item_separator/>              <menu_item_call           label="About [APP_NAME]"           name="About Second Life"> @@ -3031,15 +3038,7 @@           name="Dump Scripted Camera">              <menu_item_call.on_click               function="Advanced.DumpScriptedCamera" /> -        </menu_item_call> -        <menu_item_call -             label="Bumps, Pushes & Hits" -             name="Bumps, Pushes &amp; Hits"> -                <menu_item_call.on_click -                 function="Floater.Show" -                 parameter="bumps" /> -            </menu_item_call> - +        </menu_item_call>                <menu           create_jump_keys="true"           label="Recorder" diff --git a/indra/newview/skins/default/xui/en/panel_login_first.xml b/indra/newview/skins/default/xui/en/panel_login_first.xml index 84753c55a3..d1416ece82 100644 --- a/indra/newview/skins/default/xui/en/panel_login_first.xml +++ b/indra/newview/skins/default/xui/en/panel_login_first.xml @@ -102,7 +102,7 @@              allow_text_entry="true"              follows="left|bottom"              height="32" -            left="0" +            left="2"              label="Username"              combo_editor.font="SansSerifLarge"              max_chars="128" @@ -163,7 +163,7 @@              text_color="EmphasisColor"              height="16"              name="forgot_password_text" -            left="216" +            left="219"              top="34"              width="200">              Forgotten password diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index c5dfb703e5..9be01c5d4f 100755 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -395,16 +395,20 @@                   left_pad="0"                   layout="topleft"                   follows="left|top" -                 name="combobox sale copy" +                 name="ComboBoxSaleType"                   width="170"> -                <combo_box.item -                     label="Copy" -                     name="Copy" -                     value="Copy" /> -                <combo_box.item -                     label="Original" -                     name="Original" -                     value="Original" /> +              <combo_box.item +                   name="Copy" +                   label="Copy" +                   value="2" /> +              <combo_box.item +                   name="Contents" +                   label="Contents" +                   value="3" /> +              <combo_box.item +                   name="Original" +                   label="Original" +                   value="1" />              </combo_box>              <spinner                      follows="left|top" diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml index 6ee8fc3a4c..b84dce222f 100755 --- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml @@ -48,7 +48,7 @@              </panel.string>              <panel.string               name="Cost Total"> -                Total Price: L$ +                Sum Price: L$              </panel.string>              <panel.string               name="Cost Per Unit"> @@ -444,7 +444,7 @@          control_name="Edit Cost"          name="Edit Cost"          label="Price: L$" -        label_width="65" +        label_width="73"				          width="150"          min_val="1"          height="20" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 945a77c071..f77678e5f8 100755 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2513,6 +2513,7 @@ The [[MARKETPLACE_CREATE_STORE_URL] Marketplace store] is returning errors.  	<string name="CompileSuccessful">Compile successful!</string>  	<string name="CompileSuccessfulSaving">Compile successful, saving...</string>  	<string name="SaveComplete">Save complete.</string> +	<string name="UploadFailed">File upload failed: </string>  	<string name="ObjectOutOfRange">Script (object out of range)</string>  	<!-- god tools --> diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml index d2117f08b6..9596a8277e 100755 --- a/indra/newview/skins/default/xui/es/menu_viewer.xml +++ b/indra/newview/skins/default/xui/es/menu_viewer.xml @@ -175,6 +175,7 @@  		<menu_item_call label="Blogs de [SECOND_LIFE]" name="Second Life Blogs"/>  		<menu_item_call label="Denunciar una infracción" name="Report Abuse"/>  		<menu_item_call label="Informar de un fallo" name="Report Bug"/> +		<menu_item_call label="Bumps, Pushes & Hits" name="Bumps, Pushes &amp; Hits"/>  		<menu_item_call label="Acerca de [APP_NAME]" name="About Second Life"/>  	</menu>  	<menu label="Avanzado" name="Advanced"> @@ -322,8 +323,7 @@  		<menu label="Red" name="Network">  			<menu_item_check label="Pause Avatar" name="AgentPause"/>  			<menu_item_call label="Drop a Packet" name="Drop a Packet"/> -		</menu> -		<menu_item_call label="Bumps, Pushes & Hits" name="Bumps, Pushes &amp; Hits"/> +		</menu>		  		<menu label="Mundo virtual" name="DevelopWorld">  			<menu_item_check label="Anular el sol del Sim" name="Sim Sun Override"/>  			<menu_item_check label="Meteorología fija" name="Fixed Weather"/> diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml index 6e36d19ba9..2c30fe07b4 100755 --- a/indra/newview/skins/default/xui/fr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml @@ -176,6 +176,7 @@  		<menu_item_call label="Blogs [SECOND_LIFE]" name="Second Life Blogs"/>  		<menu_item_call label="Signaler une infraction" name="Report Abuse"/>  		<menu_item_call label="Signaler un bug" name="Report Bug"/> +		<menu_item_call label="Collisions, coups et bousculades" name="Bumps, Pushes &amp; Hits"/>  		<menu_item_call label="À propos de [APP_NAME]" name="About Second Life"/>  	</menu>  	<menu label="Avancé" name="Advanced"> @@ -352,8 +353,7 @@  			<menu_item_check label="Interpolation ping des positions des objets" name="Ping Interpolate Object Positions"/>  			<menu_item_call label="Abandonner un paquet" name="Drop a Packet"/>  		</menu> -		<menu_item_call label="Dump caméra scriptée" name="Dump Scripted Camera"/> -		<menu_item_call label="Collisions, coups et bousculades" name="Bumps, Pushes &amp; Hits"/> +		<menu_item_call label="Dump caméra scriptée" name="Dump Scripted Camera"/>		  		<menu label="Enregistreur" name="Recorder">  			<menu_item_call label="Commencer la lecture" name="Start Playback"/>  			<menu_item_call label="Arrêter la lecture" name="Stop Playback"/> diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml index f535a53e66..d25e11e7a4 100755 --- a/indra/newview/skins/default/xui/it/menu_viewer.xml +++ b/indra/newview/skins/default/xui/it/menu_viewer.xml @@ -176,6 +176,7 @@  		<menu_item_call label="[SECOND_LIFE] Blog" name="Second Life Blogs"/>  		<menu_item_call label="Segnala abuso" name="Report Abuse"/>  		<menu_item_call label="Segnala bug" name="Report Bug"/> +		<menu_item_call label="Urti, spinte e contatti" name="Bumps, Pushes &amp; Hits"/>  		<menu_item_call label="Informazioni su [APP_NAME]" name="About Second Life"/>  	</menu>  	<menu label="Avanzate" name="Advanced"> @@ -323,8 +324,7 @@  		<menu label="Rete" name="Network">  			<menu_item_check label="Metti in pausa" name="AgentPause"/>  			<menu_item_call label="Lascia un pacchetto" name="Drop a Packet"/> -		</menu> -		<menu_item_call label="Urti, spinte e contatti" name="Bumps, Pushes &amp; Hits"/> +		</menu>		  		<menu label="Mondo" name="DevelopWorld">  			<menu_item_check label="Esclusione al sole della simulazione" name="Sim Sun Override"/>  			<menu_item_check label="Clima fisso" name="Fixed Weather"/> diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml index 4e6c6808c6..0b85c693f0 100755 --- a/indra/newview/skins/default/xui/ja/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml @@ -176,6 +176,7 @@  		<menu_item_call label="[SECOND_LIFE] ブログ" name="Second Life Blogs"/>  		<menu_item_call label="嫌がらせを報告する" name="Report Abuse"/>  		<menu_item_call label="バグを報告する" name="Report Bug"/> +		<menu_item_call label="衝突・プッシュ・打撃" name="Bumps, Pushes &amp; Hits"/>  		<menu_item_call label="[APP_NAME] について" name="About Second Life"/>  	</menu>  	<menu label="アドバンス" name="Advanced"> @@ -352,8 +353,7 @@  			<menu_item_check label="挿入されたオブジェクトの位置の Ping" name="Ping Interpolate Object Positions"/>  			<menu_item_call label="パケットドロップ" name="Drop a Packet"/>  		</menu> -		<menu_item_call label="スクリプト付きカメラをダンプ" name="Dump Scripted Camera"/> -		<menu_item_call label="衝突・プッシュ・打撃" name="Bumps, Pushes &amp; Hits"/> +		<menu_item_call label="スクリプト付きカメラをダンプ" name="Dump Scripted Camera"/>		  		<menu label="レコーダー" name="Recorder">  			<menu_item_call label="再生開始" name="Start Playback"/>  			<menu_item_call label="再生停止" name="Stop Playback"/> diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml index e1725fc308..a354cca9ad 100755 --- a/indra/newview/skins/default/xui/pl/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml @@ -126,6 +126,7 @@  		<menu_item_check label="Włącz podpowiedzi" name="Enable Hints"/>  		<menu_item_call label="Złóż Raport o Nadużyciu" name="Report Abuse"/>  		<menu_item_call label="Zgłoś błędy klienta" name="Report Bug"/> +		<menu_item_call label="Zderzenia, popchnięcia &  uderzenia" name="Bumps, Pushes &amp; Hits"/>  		<menu_item_call label="O [APP_NAME]" name="About Second Life"/>  	</menu>  	<menu label="Zaawansowane" name="Advanced"> @@ -252,8 +253,7 @@  		<menu label="Sieć" name="Network">  			<menu_item_check label="Zatrzymaj awatara" name="AgentPause"/>  			<menu_item_call label="Upuść pakiet pamięci" name="Drop a Packet"/> -		</menu> -		<menu_item_call label="Zderzenia, popchnięcia &  uderzenia" name="Bumps, Pushes &amp; Hits"/> +		</menu>		  		<menu label="Świat" name="DevelopWorld">  			<menu_item_check label="Domyślne ustawienia środowiska Regionu" name="Sim Sun Override"/>  			<menu_item_check label="Ustalona pogoda" name="Fixed Weather"/> diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml index a761cfa177..0bbb9683a0 100755 --- a/indra/newview/skins/default/xui/pt/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml @@ -176,6 +176,7 @@  		<menu_item_call label="Blogs do [SECOND_LIFE]" name="Second Life Blogs"/>  		<menu_item_call label="Denunciar abuso" name="Report Abuse"/>  		<menu_item_call label="Relatar bug" name="Report Bug"/> +		<menu_item_call label="Empurrões, trombadas e tapas" name="Bumps, Pushes &amp; Hits"/>  		<menu_item_call label="Sobre [APP_NAME]" name="About Second Life"/>  	</menu>  	<menu label="Avançado" name="Advanced"> @@ -323,8 +324,7 @@  		<menu label="Rede" name="Network">  			<menu_item_check label="Pausar avatar" name="AgentPause"/>  			<menu_item_call label="Drop a Packet" name="Drop a Packet"/> -		</menu> -		<menu_item_call label="Empurrões, trombadas e tapas" name="Bumps, Pushes &amp; Hits"/> +		</menu>		  		<menu label="Mundo" name="DevelopWorld">  			<menu_item_check label="Impor sobre sol de simulação" name="Sim Sun Override"/>  			<menu_item_check label="Clima fixo" name="Fixed Weather"/> diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml index fad1ea51e0..f00a4df81f 100755 --- a/indra/newview/skins/default/xui/ru/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml @@ -167,6 +167,7 @@  		<menu_item_call label="Инструкции..." name="How To"/>  		<menu_item_call label="Жалоба" name="Report Abuse"/>  		<menu_item_call label="Сообщить об ошибке" name="Report Bug"/> +		<menu_item_call label="Столкновения, толчки и удары" name="Bumps, Pushes &amp; Hits"/>  		<menu_item_call label="О [APP_NAME]" name="About Second Life"/>  	</menu>  	<menu label="Дополнительно" name="Advanced"> @@ -343,8 +344,7 @@  			<menu_item_check label="Прикрепить объекты для интерполяции" name="Ping Interpolate Object Positions"/>  			<menu_item_call label="Опустить пакет" name="Drop a Packet"/>  		</menu> -		<menu_item_call label="Дамп камеры со скриптами" name="Dump Scripted Camera"/> -		<menu_item_call label="Столкновения, толчки и удары" name="Bumps, Pushes &amp; Hits"/> +		<menu_item_call label="Дамп камеры со скриптами" name="Dump Scripted Camera"/>		  		<menu label="Диктофон" name="Recorder">  			<menu_item_call label="Начать воспроизведение" name="Start Playback"/>  			<menu_item_call label="Остановить воспроизведение" name="Stop Playback"/> diff --git a/indra/newview/skins/default/xui/tr/menu_viewer.xml b/indra/newview/skins/default/xui/tr/menu_viewer.xml index 23e2903e03..a488a0916f 100755 --- a/indra/newview/skins/default/xui/tr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/tr/menu_viewer.xml @@ -174,6 +174,7 @@  		<menu_item_call label="[SECOND_LIFE] Blogları" name="Second Life Blogs"/>  		<menu_item_call label="Kötüye Kullanımı Bildir" name="Report Abuse"/>  		<menu_item_call label="Hata Bildir" name="Report Bug"/> +		<menu_item_call label="Toslamalar, İtmeler ve Vurmalar" name="Bumps, Pushes &amp; Hits"/>  		<menu_item_call label="[APP_NAME] Hakkında" name="About Second Life"/>  	</menu>  	<menu label="Gelişmiş" name="Advanced"> @@ -350,8 +351,7 @@  			<menu_item_check label="Nesne Konumlarını Ping İle İnterpole Edin" name="Ping Interpolate Object Positions"/>  			<menu_item_call label="Paket Bırakın" name="Drop a Packet"/>  		</menu> -		<menu_item_call label="Komut Dosyalı Kameranın Dökümünü Al" name="Dump Scripted Camera"/> -		<menu_item_call label="Toslamalar, İtmeler ve Vurmalar" name="Bumps, Pushes &amp; Hits"/> +		<menu_item_call label="Komut Dosyalı Kameranın Dökümünü Al" name="Dump Scripted Camera"/>		  		<menu label="Kaydedici" name="Recorder">  			<menu_item_call label="Oynatmayı Başlat" name="Start Playback"/>  			<menu_item_call label="Oynatmayı Durdur" name="Stop Playback"/> diff --git a/indra/newview/skins/default/xui/zh/menu_viewer.xml b/indra/newview/skins/default/xui/zh/menu_viewer.xml index 46d46e901c..adc29a3944 100755 --- a/indra/newview/skins/default/xui/zh/menu_viewer.xml +++ b/indra/newview/skins/default/xui/zh/menu_viewer.xml @@ -174,6 +174,7 @@  		<menu_item_call label="[SECOND_LIFE] 部落格" name="Second Life Blogs"/>  		<menu_item_call label="違規舉報" name="Report Abuse"/>  		<menu_item_call label="回報臭蟲" name="Report Bug"/> +		<menu_item_call label="碰撞、推擠與打擊" name="Bumps, Pushes &amp; Hits"/>  		<menu_item_call label="關於 [APP_NAME]" name="About Second Life"/>  	</menu>  	<menu label="進階" name="Advanced"> @@ -350,8 +351,7 @@  			<menu_item_check label="探詢內插物件位置" name="Ping Interpolate Object Positions"/>  			<menu_item_call label="丟出一個封包" name="Drop a Packet"/>  		</menu> -		<menu_item_call label="傾印腳本控制的攝影機" name="Dump Scripted Camera"/> -		<menu_item_call label="碰撞、推擠與打擊" name="Bumps, Pushes &amp; Hits"/> +		<menu_item_call label="傾印腳本控制的攝影機" name="Dump Scripted Camera"/>		  		<menu label="錄製器" name="Recorder">  			<menu_item_call label="開始播放" name="Start Playback"/>  			<menu_item_call label="停止播放" name="Stop Playback"/>  | 
