diff options
Diffstat (limited to 'indra')
72 files changed, 1207 insertions, 660 deletions
| diff --git a/indra/llcommon/imageids.cpp b/indra/llcommon/imageids.cpp index fe11465221..7d647e5c36 100644..100755 --- a/indra/llcommon/imageids.cpp +++ b/indra/llcommon/imageids.cpp @@ -68,3 +68,6 @@ const LLUUID TERRAIN_MOUNTAIN_DETAIL	("303cd381-8560-7579-23f1-f0a880799740"); /  const LLUUID TERRAIN_ROCK_DETAIL		("53a2f406-4895-1d13-d541-d2e3b86bc19c"); // VIEWER  const LLUUID DEFAULT_WATER_NORMAL		("822ded49-9a6c-f61c-cb89-6df54f42cdf4"); // VIEWER + +const LLUUID IMG_CHECKERBOARD_RGBA     ("2585a0f3-4163-6dd1-0f34-ad48cb909e25"); // dataserver + diff --git a/indra/llcommon/imageids.h b/indra/llcommon/imageids.h index e0c2683fdc..18c8ecb074 100644..100755 --- a/indra/llcommon/imageids.h +++ b/indra/llcommon/imageids.h @@ -66,4 +66,5 @@ LL_COMMON_API extern const LLUUID TERRAIN_ROCK_DETAIL;  LL_COMMON_API extern const LLUUID DEFAULT_WATER_NORMAL; +LL_COMMON_API extern const LLUUID IMG_CHECKERBOARD_RGBA;  #endif diff --git a/indra/llmessage/llregionflags.h b/indra/llmessage/llregionflags.h index 7b796a0fa8..1cf940918b 100644 --- a/indra/llmessage/llregionflags.h +++ b/indra/llmessage/llregionflags.h @@ -28,95 +28,98 @@  #define LL_LLREGIONFLAGS_H  // Can you be hurt here? Should health be on? -const U32 REGION_FLAGS_ALLOW_DAMAGE				= (1 << 0); +const U64 REGION_FLAGS_ALLOW_DAMAGE				= (1 << 0);  // Can you make landmarks here? -const U32 REGION_FLAGS_ALLOW_LANDMARK			= (1 << 1); +const U64 REGION_FLAGS_ALLOW_LANDMARK			= (1 << 1);  // Do we reset the home position when someone teleports away from here? -const U32 REGION_FLAGS_ALLOW_SET_HOME			= (1 << 2); +const U64 REGION_FLAGS_ALLOW_SET_HOME			= (1 << 2);  // Do we reset the home position when someone teleports away from here? -const U32 REGION_FLAGS_RESET_HOME_ON_TELEPORT	= (1 << 3); +const U64 REGION_FLAGS_RESET_HOME_ON_TELEPORT	= (1 << 3);  // Does the sun move? -const U32 REGION_FLAGS_SUN_FIXED				= (1 << 4); +const U64 REGION_FLAGS_SUN_FIXED				= (1 << 4);  // Can't change the terrain heightfield, even on owned parcels,  // but can plant trees and grass. -const U32 REGION_FLAGS_BLOCK_TERRAFORM			= (1 << 6); +const U64 REGION_FLAGS_BLOCK_TERRAFORM			= (1 << 6);  // Can't release, sell, or buy land. -const U32 REGION_FLAGS_BLOCK_LAND_RESELL		= (1 << 7); +const U64 REGION_FLAGS_BLOCK_LAND_RESELL		= (1 << 7);  // All content wiped once per night -const U32 REGION_FLAGS_SANDBOX					= (1 << 8); -const U32 REGION_FLAGS_SKIP_COLLISIONS			= (1 << 12); // Pin all non agent rigid bodies -const U32 REGION_FLAGS_SKIP_SCRIPTS				= (1 << 13); -const U32 REGION_FLAGS_SKIP_PHYSICS				= (1 << 14); // Skip all physics -const U32 REGION_FLAGS_EXTERNALLY_VISIBLE		= (1 << 15); -const U32 REGION_FLAGS_ALLOW_RETURN_ENCROACHING_OBJECT = (1 << 16); -const U32 REGION_FLAGS_ALLOW_RETURN_ENCROACHING_ESTATE_OBJECT = (1 << 17); -const U32 REGION_FLAGS_BLOCK_DWELL				= (1 << 18); +const U64 REGION_FLAGS_SANDBOX					= (1 << 8); +const U64 REGION_FLAGS_SKIP_COLLISIONS			= (1 << 12); // Pin all non agent rigid bodies +const U64 REGION_FLAGS_SKIP_SCRIPTS				= (1 << 13); +const U64 REGION_FLAGS_SKIP_PHYSICS				= (1 << 14); // Skip all physics +const U64 REGION_FLAGS_EXTERNALLY_VISIBLE		= (1 << 15); +const U64 REGION_FLAGS_ALLOW_RETURN_ENCROACHING_OBJECT = (1 << 16); +const U64 REGION_FLAGS_ALLOW_RETURN_ENCROACHING_ESTATE_OBJECT = (1 << 17); +const U64 REGION_FLAGS_BLOCK_DWELL				= (1 << 18);  // Is flight allowed? -const U32 REGION_FLAGS_BLOCK_FLY				= (1 << 19);	 +const U64 REGION_FLAGS_BLOCK_FLY				= (1 << 19);	  // Is direct teleport (p2p) allowed? -const U32 REGION_FLAGS_ALLOW_DIRECT_TELEPORT	= (1 << 20); +const U64 REGION_FLAGS_ALLOW_DIRECT_TELEPORT	= (1 << 20);  // Is there an administrative override on scripts in the region at the  // moment. This is the similar skip scripts, except this flag is  // presisted in the database on an estate level. -const U32 REGION_FLAGS_ESTATE_SKIP_SCRIPTS		= (1 << 21); +const U64 REGION_FLAGS_ESTATE_SKIP_SCRIPTS		= (1 << 21); -const U32 REGION_FLAGS_RESTRICT_PUSHOBJECT		= (1 << 22); +const U64 REGION_FLAGS_RESTRICT_PUSHOBJECT		= (1 << 22); -const U32 REGION_FLAGS_DENY_ANONYMOUS			= (1 << 23); +const U64 REGION_FLAGS_DENY_ANONYMOUS			= (1 << 23); -const U32 REGION_FLAGS_ALLOW_PARCEL_CHANGES		= (1 << 26); +const U64 REGION_FLAGS_ALLOW_PARCEL_CHANGES		= (1 << 26); -const U32 REGION_FLAGS_ALLOW_VOICE = (1 << 28); +const U64 REGION_FLAGS_ALLOW_VOICE = (1 << 28); -const U32 REGION_FLAGS_BLOCK_PARCEL_SEARCH = (1 << 29); -const U32 REGION_FLAGS_DENY_AGEUNVERIFIED	= (1 << 30); +const U64 REGION_FLAGS_BLOCK_PARCEL_SEARCH = (1 << 29); +const U64 REGION_FLAGS_DENY_AGEUNVERIFIED	= (1 << 30); -const U32 REGION_FLAGS_DEFAULT = REGION_FLAGS_ALLOW_LANDMARK | +const U64 REGION_FLAGS_DEFAULT = REGION_FLAGS_ALLOW_LANDMARK |  								 REGION_FLAGS_ALLOW_SET_HOME |                                   REGION_FLAGS_ALLOW_PARCEL_CHANGES |                                   REGION_FLAGS_ALLOW_VOICE; -const U32 REGION_FLAGS_PRELUDE_SET = REGION_FLAGS_RESET_HOME_ON_TELEPORT; -const U32 REGION_FLAGS_PRELUDE_UNSET = REGION_FLAGS_ALLOW_LANDMARK  +const U64 REGION_FLAGS_PRELUDE_SET = REGION_FLAGS_RESET_HOME_ON_TELEPORT; +const U64 REGION_FLAGS_PRELUDE_UNSET = REGION_FLAGS_ALLOW_LANDMARK   									   | REGION_FLAGS_ALLOW_SET_HOME; -const U32 REGION_FLAGS_ESTATE_MASK = REGION_FLAGS_EXTERNALLY_VISIBLE +const U64 REGION_FLAGS_ESTATE_MASK = REGION_FLAGS_EXTERNALLY_VISIBLE  									 | REGION_FLAGS_SUN_FIXED  									 | REGION_FLAGS_DENY_ANONYMOUS  									 | REGION_FLAGS_DENY_AGEUNVERIFIED; -inline BOOL is_prelude( U32 flags ) +inline BOOL is_prelude( U64 flags )  {  	// definition of prelude does not depend on fixed-sun  	return 0 == (flags & REGION_FLAGS_PRELUDE_UNSET)  		   && 0 != (flags & REGION_FLAGS_PRELUDE_SET);  } -inline U32 set_prelude_flags(U32 flags) +inline U64 set_prelude_flags(U64 flags)  {  	// also set the sun-fixed flag  	return ((flags & ~REGION_FLAGS_PRELUDE_UNSET)  			| (REGION_FLAGS_PRELUDE_SET | REGION_FLAGS_SUN_FIXED));  } -inline U32 unset_prelude_flags(U32 flags) +inline U64 unset_prelude_flags(U64 flags)  {  	// also unset the fixed-sun flag  	return ((flags | REGION_FLAGS_PRELUDE_UNSET)   			& ~(REGION_FLAGS_PRELUDE_SET | REGION_FLAGS_SUN_FIXED));  } +// Region protocols +const U64 REGION_PROTOCOLS_AGENT_APPEARANCE_SERVICE = (1 << 0); +  // estate constants. Need to match first few etries in indra.estate table.  const U32 ESTATE_ALL = 0; // will not match in db, reserved key for logic  const U32 ESTATE_MAINLAND = 1; diff --git a/indra/llmessage/message_prehash.cpp b/indra/llmessage/message_prehash.cpp index d7658862da..39cfb6019e 100644 --- a/indra/llmessage/message_prehash.cpp +++ b/indra/llmessage/message_prehash.cpp @@ -279,6 +279,8 @@ char const* const _PREHASH_GrabOffset = LLMessageStringTable::getInstance()->get  char const* const _PREHASH_SimPort = LLMessageStringTable::getInstance()->getString("SimPort");  char const* const _PREHASH_PricePerMeter = LLMessageStringTable::getInstance()->getString("PricePerMeter");  char const* const _PREHASH_RegionFlags = LLMessageStringTable::getInstance()->getString("RegionFlags"); +char const* const _PREHASH_RegionFlagsExtended = LLMessageStringTable::getInstance()->getString("RegionFlagsExtended"); +char const* const _PREHASH_RegionProtocols = LLMessageStringTable::getInstance()->getString("RegionProtocols");  char const* const _PREHASH_VoteResult = LLMessageStringTable::getInstance()->getString("VoteResult");  char const* const _PREHASH_ParcelDirFeeEstimate = LLMessageStringTable::getInstance()->getString("ParcelDirFeeEstimate");  char const* const _PREHASH_ModifyBlock = LLMessageStringTable::getInstance()->getString("ModifyBlock"); @@ -305,6 +307,8 @@ char const* const _PREHASH_ViewerStartAuction = LLMessageStringTable::getInstanc  char const* const _PREHASH_StartAuction = LLMessageStringTable::getInstance()->getString("StartAuction");  char const* const _PREHASH_DuplicateFlags = LLMessageStringTable::getInstance()->getString("DuplicateFlags");  char const* const _PREHASH_RegionInfo2 = LLMessageStringTable::getInstance()->getString("RegionInfo2"); +char const* const _PREHASH_RegionInfo3 = LLMessageStringTable::getInstance()->getString("RegionInfo3"); +char const* const _PREHASH_RegionInfo4 = LLMessageStringTable::getInstance()->getString("RegionInfo4");  char const* const _PREHASH_TextColor = LLMessageStringTable::getInstance()->getString("TextColor");  char const* const _PREHASH_SlaveID = LLMessageStringTable::getInstance()->getString("SlaveID");  char const* const _PREHASH_Charter = LLMessageStringTable::getInstance()->getString("Charter"); @@ -1376,3 +1380,6 @@ char const* const _PREHASH_ProductSKU = LLMessageStringTable::getInstance()->get  char const* const _PREHASH_SeeAVs = LLMessageStringTable::getInstance()->getString("SeeAVs");  char const* const _PREHASH_AnyAVSounds = LLMessageStringTable::getInstance()->getString("AnyAVSounds");  char const* const _PREHASH_GroupAVSounds = LLMessageStringTable::getInstance()->getString("GroupAVSounds"); +char const* const _PREHASH_AppearanceData = LLMessageStringTable::getInstance()->getString("AppearanceData"); +char const* const _PREHASH_AppearanceVersion = LLMessageStringTable::getInstance()->getString("AppearanceVersion"); +char const* const _PREHASH_CofVersion = LLMessageStringTable::getInstance()->getString("CofVersion"); diff --git a/indra/llmessage/message_prehash.h b/indra/llmessage/message_prehash.h index da2b613f53..573e10dc0b 100644 --- a/indra/llmessage/message_prehash.h +++ b/indra/llmessage/message_prehash.h @@ -279,6 +279,8 @@ extern char const* const _PREHASH_GrabOffset;  extern char const* const _PREHASH_SimPort;  extern char const* const _PREHASH_PricePerMeter;  extern char const* const _PREHASH_RegionFlags; +extern char const* const _PREHASH_RegionFlagsExtended; +extern char const* const _PREHASH_RegionProtocols;  extern char const* const _PREHASH_VoteResult;  extern char const* const _PREHASH_ParcelDirFeeEstimate;  extern char const* const _PREHASH_ModifyBlock; @@ -305,6 +307,8 @@ extern char const* const _PREHASH_ViewerStartAuction;  extern char const* const _PREHASH_StartAuction;  extern char const* const _PREHASH_DuplicateFlags;  extern char const* const _PREHASH_RegionInfo2; +extern char const* const _PREHASH_RegionInfo3; +extern char const* const _PREHASH_RegionInfo4;  extern char const* const _PREHASH_TextColor;  extern char const* const _PREHASH_SlaveID;  extern char const* const _PREHASH_Charter; @@ -1376,4 +1380,7 @@ extern char const* const _PREHASH_ProductSKU;  extern char const* const _PREHASH_SeeAVs;  extern char const* const _PREHASH_AnyAVSounds;  extern char const* const _PREHASH_GroupAVSounds; +extern char const* const _PREHASH_AppearanceData; +extern char const* const _PREHASH_AppearanceVersion; +extern char const* const _PREHASH_CofVersion;  #endif diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp index 6dee192783..b765ed60c4 100755 --- a/indra/llprimitive/llprimitive.cpp +++ b/indra/llprimitive/llprimitive.cpp @@ -39,6 +39,7 @@  #include "lldatapacker.h"  #include "llsdutil_math.h"  #include "llprimtexturelist.h" +#include "imageids.h"  /**   * exported constants @@ -1234,94 +1235,77 @@ BOOL LLPrimitive::packTEMessage(LLDataPacker &dp) const  	return FALSE;  } -S32 LLPrimitive::unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name) +S32 LLPrimitive::parseTEMessage(LLMessageSystem* mesgsys, char const* block_name, const S32 block_num, LLTEContents& tec)  { -	return(unpackTEMessage(mesgsys,block_name,-1)); -} - -S32 LLPrimitive::unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name, const S32 block_num) -{ -	// use a negative block_num to indicate a single-block read (a non-variable block)  	S32 retval = 0; -	const U32 MAX_TES = 32; - -	// Avoid construction of 32 UUIDs per call. JC - -	U8     image_data[MAX_TES*16]; -	U8	  colors[MAX_TES*4]; -	F32    scale_s[MAX_TES]; -	F32    scale_t[MAX_TES]; -	S16    offset_s[MAX_TES]; -	S16    offset_t[MAX_TES]; -	S16    image_rot[MAX_TES]; -	U8	   bump[MAX_TES]; -	U8	   media_flags[MAX_TES]; -    U8     glow[MAX_TES]; -	 -	const U32 MAX_TE_BUFFER = 4096; -	U8 packed_buffer[MAX_TE_BUFFER]; -	U8 *cur_ptr = packed_buffer; - -	U32 size; -	U32 face_count = 0;  	if (block_num < 0)  	{ -		size = mesgsys->getSizeFast(block_name, _PREHASH_TextureEntry); +		tec.size = mesgsys->getSizeFast(block_name, _PREHASH_TextureEntry);  	}  	else  	{ -		size = mesgsys->getSizeFast(block_name, block_num, _PREHASH_TextureEntry); +		tec.size = mesgsys->getSizeFast(block_name, block_num, _PREHASH_TextureEntry);  	} -	if (size == 0) +	if (tec.size == 0)  	{  		return retval;  	}  	if (block_num < 0)  	{ -		mesgsys->getBinaryDataFast(block_name, _PREHASH_TextureEntry, packed_buffer, 0, 0, MAX_TE_BUFFER); +		mesgsys->getBinaryDataFast(block_name, _PREHASH_TextureEntry, tec.packed_buffer, 0, 0, LLTEContents::MAX_TE_BUFFER);  	}  	else  	{ -		mesgsys->getBinaryDataFast(block_name, _PREHASH_TextureEntry, packed_buffer, 0, block_num, MAX_TE_BUFFER); +		mesgsys->getBinaryDataFast(block_name, _PREHASH_TextureEntry, tec.packed_buffer, 0, block_num, LLTEContents::MAX_TE_BUFFER);  	} -	face_count = getNumTEs(); +	tec.face_count = getNumTEs(); -	cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)image_data, 16, face_count, MVT_LLUUID); +	U8 *cur_ptr = tec.packed_buffer; +	cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.image_data, 16, tec.face_count, MVT_LLUUID);  	cur_ptr++; -	cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)colors, 4, face_count, MVT_U8); +	cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.colors, 4, tec.face_count, MVT_U8);  	cur_ptr++; -	cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)scale_s, 4, face_count, MVT_F32); +	cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.scale_s, 4, tec.face_count, MVT_F32);  	cur_ptr++; -	cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)scale_t, 4, face_count, MVT_F32); +	cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.scale_t, 4, tec.face_count, MVT_F32);  	cur_ptr++; -	cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)offset_s, 2, face_count, MVT_S16Array); +	cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.offset_s, 2, tec.face_count, MVT_S16Array);  	cur_ptr++; -	cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)offset_t, 2, face_count, MVT_S16Array); +	cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.offset_t, 2, tec.face_count, MVT_S16Array);  	cur_ptr++; -	cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)image_rot, 2, face_count, MVT_S16Array); +	cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.image_rot, 2, tec.face_count, MVT_S16Array);  	cur_ptr++; -	cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)bump, 1, face_count, MVT_U8); +	cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.bump, 1, tec.face_count, MVT_U8);  	cur_ptr++; -	cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)media_flags, 1, face_count, MVT_U8); +	cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.media_flags, 1, tec.face_count, MVT_U8);  	cur_ptr++; -	cur_ptr += unpackTEField(cur_ptr, packed_buffer+size, (U8 *)glow, 1, face_count, MVT_U8); -	 +	cur_ptr += unpackTEField(cur_ptr, tec.packed_buffer+tec.size, (U8 *)tec.glow, 1, tec.face_count, MVT_U8); + +	retval = 1; +	return retval; +} + +S32 LLPrimitive::applyParsedTEMessage(LLTEContents& tec) +{ +	S32 retval = 0; +  	LLColor4 color;  	LLColor4U coloru; -	for (U32 i = 0; i < face_count; i++) -	{ -		retval |= setTETexture(i, ((LLUUID*)image_data)[i]); -		retval |= setTEScale(i, scale_s[i], scale_t[i]); -		retval |= setTEOffset(i, (F32)offset_s[i] / (F32)0x7FFF, (F32) offset_t[i] / (F32) 0x7FFF); -		retval |= setTERotation(i, ((F32)image_rot[i] / TEXTURE_ROTATION_PACK_FACTOR) * F_TWO_PI); -		retval |= setTEBumpShinyFullbright(i, bump[i]); -		retval |= setTEMediaTexGen(i, media_flags[i]); -		retval |= setTEGlow(i, (F32)glow[i] / (F32)0xFF); -		coloru = LLColor4U(colors + 4*i); +	for (U32 i = 0; i < tec.face_count; i++) +	{ +		LLUUID& req_id = ((LLUUID*)tec.image_data)[i]; +		retval |= setTETexture(i, req_id); +		retval |= setTEScale(i, tec.scale_s[i], tec.scale_t[i]); +		retval |= setTEOffset(i, (F32)tec.offset_s[i] / (F32)0x7FFF, (F32) tec.offset_t[i] / (F32) 0x7FFF); +		retval |= setTERotation(i, ((F32)tec.image_rot[i] / TEXTURE_ROTATION_PACK_FACTOR) * F_TWO_PI); +		retval |= setTEBumpShinyFullbright(i, tec.bump[i]); +		retval |= setTEMediaTexGen(i, tec.media_flags[i]); +		retval |= setTEGlow(i, (F32)tec.glow[i] / (F32)0xFF); +		coloru = LLColor4U(tec.colors + 4*i);  		// Note:  This is an optimization to send common colors (1.f, 1.f, 1.f, 1.f)  		// as all zeros.  However, the subtraction and addition must be done in unsigned @@ -1338,6 +1322,15 @@ S32 LLPrimitive::unpackTEMessage(LLMessageSystem* mesgsys, char const* block_nam  	return retval;  } +S32 LLPrimitive::unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name, const S32 block_num) +{ +	LLTEContents tec; +	S32 retval = parseTEMessage(mesgsys, block_name, block_num, tec); +	if (!retval) +		return retval; +	return applyParsedTEMessage(tec); +} +  S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp)  {  	// use a negative block_num to indicate a single-block read (a non-variable block) diff --git a/indra/llprimitive/llprimitive.h b/indra/llprimitive/llprimitive.h index 8dcaa8c740..6a8b59c81c 100644..100755 --- a/indra/llprimitive/llprimitive.h +++ b/indra/llprimitive/llprimitive.h @@ -289,6 +289,34 @@ public:  }; +// This code is not naming-standards compliant. Leaving it like this for +// now to make the connection to code in +// 	BOOL packTEMessage(LLDataPacker &dp) const; +// more obvious. This should be refactored to remove the duplication, at which +// point we can fix the names as well. +// - Vir +struct LLTEContents +{ +	static const U32 MAX_TES = 32; + +	U8     image_data[MAX_TES*16]; +	U8	  colors[MAX_TES*4]; +	F32    scale_s[MAX_TES]; +	F32    scale_t[MAX_TES]; +	S16    offset_s[MAX_TES]; +	S16    offset_t[MAX_TES]; +	S16    image_rot[MAX_TES]; +	U8	   bump[MAX_TES]; +	U8	   media_flags[MAX_TES]; +    U8     glow[MAX_TES]; +	 +	static const U32 MAX_TE_BUFFER = 4096; +	U8 packed_buffer[MAX_TE_BUFFER]; + +	U32 size; +	U32 face_count; +}; +  class LLPrimitive : public LLXform  {  public: @@ -360,9 +388,10 @@ public:  	S32 unpackTEField(U8 *cur_ptr, U8 *buffer_end, U8 *data_ptr, U8 data_size, U8 face_count, EMsgVariableType type);  	BOOL packTEMessage(LLMessageSystem *mesgsys) const;  	BOOL packTEMessage(LLDataPacker &dp) const; -	S32 unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name);  	S32 unpackTEMessage(LLMessageSystem* mesgsys, char const* block_name, const S32 block_num); // Variable num of blocks  	BOOL unpackTEMessage(LLDataPacker &dp); +	S32 parseTEMessage(LLMessageSystem* mesgsys, char const* block_name, const S32 block_num, LLTEContents& tec); +	S32 applyParsedTEMessage(LLTEContents& tec);  #ifdef CHECK_FOR_FINITE  	inline void setPosition(const LLVector3& pos); diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 0031362210..8c4b7b28c4 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -440,6 +440,7 @@ set(viewer_SOURCE_FILES      llpathfindingpathtool.cpp      llphysicsmotion.cpp      llphysicsshapebuilderutil.cpp +    llpipelinelistener.cpp      llplacesinventorybridge.cpp      llplacesinventorypanel.cpp      llpopupview.cpp @@ -1005,6 +1006,7 @@ set(viewer_HEADER_FILES      llpathfindingpathtool.h      llphysicsmotion.h      llphysicsshapebuilderutil.h +    llpipelinelistener.h      llplacesinventorybridge.h      llplacesinventorypanel.h      llpolymesh.h diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 5e42fc29f7..69986af83b 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -71,6 +71,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>AgentAppearanceServiceURL</key> +    <map> +      <key>Comment</key> +      <string>Current Session Agent Appearance Service URL</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string></string> +    </map>      <key>AlertedUnsupportedHardware</key>      <map>        <key>Comment</key> @@ -8716,6 +8727,28 @@        <key>Value</key>        <integer>1</integer>      </map> +    <key>DisableAllRenderTypes</key> +    <map> +      <key>Comment</key> +      <string>Disables all rendering types.</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>DisableAllRenderFeatures</key> +    <map> +      <key>Comment</key> +      <string>Disables all rendering features.</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RenderHUDInSnapshot</key>      <map>        <key>Comment</key> @@ -13098,6 +13131,28 @@        <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> +      <integer>-1.0</integer> +    </map> +    <key>ForcePeriodicRenderingTime</key> +    <map> +      <key>Comment</key> +      <string>Periodically enable all rendering masks for a single frame.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <integer>-1.0</integer> +    </map>      <key>ZoomDirect</key>      <map>        <key>Comment</key> diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 99dbfcae51..2b090c4fa4 100644..100755 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -12291,6 +12291,17 @@ render_pass="bump">  	 <param_driver />      </param> +    <param +     id="11000" +     group="0" +     name="AppearanceMessage_Version" +     label="AppearanceMessage Version" +     value_default="0" +     value_min="0" +     value_max="255"> +	 <param_driver /> +    </param> +    </driver_parameters>    <morph_masks> diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index 20936c6460..fa9ce703a8 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -117,18 +117,32 @@ export LD_LIBRARY_PATH="$PWD/lib:${LD_LIBRARY_PATH}"  # Simply embedding $(<etc/gridargs.dat) into a command line treats each of  # Second, Life and Developer as separate args -- no good. We need bash to  # process quotes using eval. -# First read it without scanning, then scan that string. Break quoted words +# First, check if we have been instructed to skip reading in gridargs.dat: +skip_gridargs=false +argnum=0 +for ARG in "$@"; do +    if [ "--skip-gridargs" == "$ARG" ]; then +        skip_gridargs=true +    else +        ARGS[$argnum]="$ARG" +        argnum=$(($argnum+1)) +    fi +done + +# Second, read it without scanning, then scan that string. Break quoted words  # into a bash array. Note that if gridargs.dat is empty, or contains only  # whitespace, the resulting gridargs array will be empty -- zero entries --  # therefore "${gridargs[@]}" entirely vanishes from the command line below,  # just as we want. -eval gridargs=("$(<etc/gridargs.dat)") +if ! $skip_gridargs ; then +    eval gridargs=("$(<etc/gridargs.dat)") +fi  # Run the program.  # Don't quote $LL_WRAPPER because, if empty, it should simply vanish from the  # command line. But DO quote "$@": preserve separate args as individually  # quoted. Similar remarks about the contents of gridargs. -$LL_WRAPPER bin/do-not-directly-run-secondlife-bin "${gridargs[@]}" "$@" +$LL_WRAPPER bin/do-not-directly-run-secondlife-bin "${gridargs[@]}" "${ARGS[@]}"  LL_RUN_ERR=$?  # Handle any resulting errors diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 447836910d..2379c23969 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -35,6 +35,7 @@  #include "llagentlistener.h"  #include "llagentwearables.h"  #include "llagentui.h" +#include "llappearancemgr.h"  #include "llanimationstates.h"  #include "llcallingcard.h"  #include "llcapabilitylistener.h" @@ -4259,7 +4260,7 @@ void LLAgent::requestLeaveGodMode()  //-----------------------------------------------------------------------------  void LLAgent::sendAgentSetAppearance()  { -	if (!isAgentAvatarValid()) return; +	if (!isAgentAvatarValid() || (getRegion() && getRegion()->getCentralBakeVersion())) return;  	if (gAgentQueryManager.mNumPendingQueries > 0 && (isAgentAvatarValid() && gAgentAvatarp->isUsingBakedTextures()))   	{ diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 751b73e1eb..a544909e66 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -2251,7 +2251,7 @@ void LLAgentCamera::changeCameraToThirdPerson(BOOL animate)  //-----------------------------------------------------------------------------  void LLAgentCamera::changeCameraToCustomizeAvatar()  { -	if (LLViewerJoystick::getInstance()->getOverrideCamera()) +	if (LLViewerJoystick::getInstance()->getOverrideCamera() || !isAgentAvatarValid())  	{  		return;  	} @@ -2275,29 +2275,21 @@ void LLAgentCamera::changeCameraToCustomizeAvatar()  		gFocusMgr.setKeyboardFocus( NULL );  		gFocusMgr.setMouseCapture( NULL ); -		LLVOAvatarSelf::onCustomizeStart(); - -		if (isAgentAvatarValid()) -		{ -			// Remove any pitch or rotation from the avatar -			LLVector3 at = gAgent.getAtAxis(); -			at.mV[VZ] = 0.f; -			at.normalize(); -			gAgent.resetAxes(at); - -			gAgent.sendAnimationRequest(ANIM_AGENT_CUSTOMIZE, ANIM_REQUEST_START); -			gAgent.setCustomAnim(TRUE); -			gAgentAvatarp->startMotion(ANIM_AGENT_CUSTOMIZE); -			LLMotion* turn_motion = gAgentAvatarp->findMotion(ANIM_AGENT_CUSTOMIZE); +		// Remove any pitch or rotation from the avatar +		LLVector3 at = gAgent.getAtAxis(); +		at.mV[VZ] = 0.f; +		at.normalize(); +		gAgent.resetAxes(at); -			if (turn_motion) -			{ -				// delay camera animation long enough to play through turn animation -				setAnimationDuration(turn_motion->getDuration() + CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP); -			} +		gAgent.sendAnimationRequest(ANIM_AGENT_CUSTOMIZE, ANIM_REQUEST_START); +		gAgent.setCustomAnim(TRUE); +		gAgentAvatarp->startMotion(ANIM_AGENT_CUSTOMIZE); +		LLMotion* turn_motion = gAgentAvatarp->findMotion(ANIM_AGENT_CUSTOMIZE); -			gAgentAvatarp->invalidateAll(); -			gAgentAvatarp->updateMeshTextures(); +		if (turn_motion) +		{ +			// delay camera animation long enough to play through turn animation +			setAnimationDuration(turn_motion->getDuration() + CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP);  		}  	} diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index e441f21f90..53a255fe92 100755 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -1597,7 +1597,7 @@ void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLWearable* n  void LLAgentWearables::queryWearableCache()  { -	if (!areWearablesLoaded()) +	if (!areWearablesLoaded() || (gAgent.getRegion() && gAgent.getRegion()->getCentralBakeVersion()))  	{  		return;  	} @@ -1715,7 +1715,7 @@ void LLAgentWearables::userRemoveWearablesOfType(const LLWearableType::EType &ty  	}  } -// Combines userRemoveAllAttachments() and userAttachMultipleAttachments() logic to +// Combines userRemoveMulipleAttachments() and userAttachMultipleAttachments() logic to  // get attachments into desired state with minimal number of adds/removes.  void LLAgentWearables::userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array)  { @@ -1811,31 +1811,6 @@ void LLAgentWearables::userRemoveMultipleAttachments(llvo_vec_t& objects_to_remo  	gMessageSystem->sendReliable(gAgent.getRegionHost());  } -void LLAgentWearables::userRemoveAllAttachments() -{ -	if (!isAgentAvatarValid()) return; - -	llvo_vec_t objects_to_remove; -	 -	for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin();  -		 iter != gAgentAvatarp->mAttachmentPoints.end();) -	{ -		LLVOAvatar::attachment_map_t::iterator curiter = iter++; -		LLViewerJointAttachment* attachment = curiter->second; -		for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); -			 attachment_iter != attachment->mAttachedObjects.end(); -			 ++attachment_iter) -		{ -			LLViewerObject *attached_object = (*attachment_iter); -			if (attached_object) -			{ -				objects_to_remove.push_back(attached_object); -			} -		} -	} -	userRemoveMultipleAttachments(objects_to_remove); -} -  void LLAgentWearables::userAttachMultipleAttachments(LLInventoryModel::item_array_t& obj_item_array)  {  	// Build a compound message to send all the objects that need to be rezzed. diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index 5932be21c6..550560d7bc 100755 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -215,7 +215,6 @@ public:  	static void 	userUpdateAttachments(LLInventoryModel::item_array_t& obj_item_array);  	static void		userRemoveMultipleAttachments(llvo_vec_t& llvo_array); -	static void		userRemoveAllAttachments();  	static void		userAttachMultipleAttachments(LLInventoryModel::item_array_t& obj_item_array);  	BOOL			itemUpdatePending(const LLUUID& item_id) const; diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 6d67e098a6..2864338ef5 100755 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -698,7 +698,7 @@ void LLWearableHoldingPattern::clearCOFLinksForMissingWearables()  		{  			// Wearable link that was never resolved; remove links to it from COF  			LL_INFOS("Avatar") << self_av_string() << "removing link for unresolved item " << data.mItemID.asString() << LL_ENDL; -			LLAppearanceMgr::instance().removeCOFItemLinks(data.mItemID,false); +			LLAppearanceMgr::instance().removeCOFItemLinks(data.mItemID);  		}  	}  } @@ -812,7 +812,7 @@ void LLWearableHoldingPattern::handleLateArrivals()  		if (data.mWearable && data.mIsReplacement &&  			replaced_types.find(data.mWearableType) != replaced_types.end())  		{ -			LLAppearanceMgr::instance().removeCOFItemLinks(data.mItemID,false); +			LLAppearanceMgr::instance().removeCOFItemLinks(data.mItemID);  			std::list<LLFoundData>::iterator clobber_ator = iter;  			++iter;  			getFoundList().erase(clobber_ator); @@ -926,6 +926,18 @@ const LLUUID LLAppearanceMgr::getCOF() const  	return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);  } +S32 LLAppearanceMgr::getCOFVersion() const +{ +	LLViewerInventoryCategory *cof = gInventory.getCategory(getCOF()); +	if (cof) +	{ +		return cof->getVersion(); +	} +	else +	{ +		return LLViewerInventoryCategory::VERSION_UNKNOWN; +	} +}  const LLViewerInventoryItem* LLAppearanceMgr::getBaseOutfitLink()  { @@ -1040,7 +1052,7 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up  			if ((replace && wearable_count != 0) ||  				(wearable_count >= LLAgentWearables::MAX_CLOTHING_PER_TYPE) )  			{ -				removeCOFItemLinks(gAgentWearables.getWearableItemID(item_to_wear->getWearableType(), wearable_count-1), false); +				removeCOFItemLinks(gAgentWearables.getWearableItemID(item_to_wear->getWearableType(), wearable_count-1));  			}  			addCOFItemLink(item_to_wear, do_update, cb);  		}  @@ -1050,7 +1062,7 @@ bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_up  		// Remove the existing wearables of the same type.  		// Remove existing body parts anyway because we must not be able to wear e.g. two skins. -		removeCOFLinksOfType(item_to_wear->getWearableType(), false); +		removeCOFLinksOfType(item_to_wear->getWearableType());  		addCOFItemLink(item_to_wear, do_update, cb);  		break; @@ -1148,11 +1160,13 @@ void LLAppearanceMgr::takeOffOutfit(const LLUUID& cat_id)  	LLInventoryModel::item_array_t::const_iterator it = items.begin();  	const LLInventoryModel::item_array_t::const_iterator it_end = items.end(); +	uuid_vec_t uuids_to_remove;  	for( ; it_end != it; ++it)  	{  		LLViewerInventoryItem* item = *it; -		removeItemFromAvatar(item->getUUID()); +		uuids_to_remove.push_back(item->getUUID());  	} +	removeItemsFromAvatar(uuids_to_remove);  }  // Create a copy of src_id + contents as a subfolder of dst_id. @@ -1731,6 +1745,12 @@ void LLAppearanceMgr::updateAppearanceFromCOF(bool update_base_outfit_ordering)  	// the saved outfit stored as a folder link  	updateIsDirty(); +	// Send server request for appearance update +	if (gAgent.getRegion() && gAgent.getRegion()->getCentralBakeVersion()) +	{ +		requestServerAppearanceUpdate(); +	} +	  	//dumpCat(getCOF(),"COF, start");  	bool follow_folder_links = true; @@ -2195,7 +2215,62 @@ void LLAppearanceMgr::addEnsembleLink( LLInventoryCategory* cat, bool do_update  #endif  } -void LLAppearanceMgr::removeCOFItemLinks(const LLUUID& item_id, bool do_update) +void LLAppearanceMgr::removeAllClothesFromAvatar() +{ +	// Fetch worn clothes (i.e. the ones in COF). +	LLInventoryModel::item_array_t clothing_items; +	LLInventoryModel::cat_array_t dummy; +	LLIsType is_clothing(LLAssetType::AT_CLOTHING); +	gInventory.collectDescendentsIf(getCOF(), +									dummy, +									clothing_items, +									LLInventoryModel::EXCLUDE_TRASH, +									is_clothing, +									false); +	uuid_vec_t item_ids; +	for (LLInventoryModel::item_array_t::iterator it = clothing_items.begin(); +		it != clothing_items.end(); ++it) +	{ +		item_ids.push_back((*it).get()->getLinkedUUID()); +	} + +	// Take them off by removing from COF. +	removeItemsFromAvatar(item_ids); +} + +void LLAppearanceMgr::removeAllAttachmentsFromAvatar() +{ +	if (!isAgentAvatarValid()) return; + +	LLAgentWearables::llvo_vec_t objects_to_remove; +	 +	for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin();  +		 iter != gAgentAvatarp->mAttachmentPoints.end();) +	{ +		LLVOAvatar::attachment_map_t::iterator curiter = iter++; +		LLViewerJointAttachment* attachment = curiter->second; +		for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); +			 attachment_iter != attachment->mAttachedObjects.end(); +			 ++attachment_iter) +		{ +			LLViewerObject *attached_object = (*attachment_iter); +			if (attached_object) +			{ +				objects_to_remove.push_back(attached_object); +			} +		} +	} +	uuid_vec_t ids_to_remove; +	for (LLAgentWearables::llvo_vec_t::iterator it = objects_to_remove.begin(); +		 it != objects_to_remove.end(); +		 ++it) +	{ +		ids_to_remove.push_back((*it)->getAttachmentItemID()); +	} +	removeItemsFromAvatar(ids_to_remove); +} + +void LLAppearanceMgr::removeCOFItemLinks(const LLUUID& item_id)  {  	gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); @@ -2213,13 +2288,9 @@ void LLAppearanceMgr::removeCOFItemLinks(const LLUUID& item_id, bool do_update)  			gInventory.purgeObject(item->getUUID());  		}  	} -	if (do_update) -	{ -		LLAppearanceMgr::updateAppearanceFromCOF(); -	}  } -void LLAppearanceMgr::removeCOFLinksOfType(LLWearableType::EType type, bool do_update) +void LLAppearanceMgr::removeCOFLinksOfType(LLWearableType::EType type)  {  	LLFindWearablesOfType filter_wearables_of_type(type);  	LLInventoryModel::cat_array_t cats; @@ -2235,11 +2306,6 @@ void LLAppearanceMgr::removeCOFLinksOfType(LLWearableType::EType type, bool do_u  			gInventory.purgeObject(item->getUUID());  		}  	} - -	if (do_update) -	{ -		updateAppearanceFromCOF(); -	}  }  bool sort_by_linked_uuid(const LLViewerInventoryItem* item1, const LLViewerInventoryItem* item2) @@ -2582,8 +2648,36 @@ void LLAppearanceMgr::updateClothingOrderingInfo(LLUUID cat_id, bool update_base  	if (inventory_changed) gInventory.notifyObservers();  } +class RequestAgentUpdateAppearanceResponder: public LLHTTPClient::Responder +{ +public: +	RequestAgentUpdateAppearanceResponder() {} +	/*virtual*/ void error(U32 status, const std::string& reason) +	{ +		llwarns << "appearance update request failed, reason: " << reason << llendl; +	}	 +}; - +void LLAppearanceMgr::requestServerAppearanceUpdate() +{ +	if (!gAgent.getRegion()) +	{ +		llwarns << "Region not set, cannot request server appearance update" << llendl; +	} +	std::string url = gAgent.getRegion()->getCapability("UpdateAvatarAppearance");	 +	if (url.empty()) +	{ +		llwarns << "NO CAP for UpdateAvatarAppearance. This is a bug." << llendl; +		return; +	} +	 +	LLSD body; +	S32 cof_version = getCOFVersion(); +	body["cof_version"] = cof_version; +	LLHTTPClient::post(url, body, new RequestAgentUpdateAppearanceResponder); +	llassert(cof_version >= mLastUpdateRequestCOFVersion); +	mLastUpdateRequestCOFVersion = cof_version; +}  class LLShowCreatedOutfit: public LLInventoryCallback  { @@ -2660,33 +2754,26 @@ void LLAppearanceMgr::wearBaseOutfit()  	updateCOF(base_outfit_id);  } -void LLAppearanceMgr::removeItemFromAvatar(const LLUUID& id_to_remove) +void LLAppearanceMgr::removeItemsFromAvatar(const uuid_vec_t& ids_to_remove)  { -	LLViewerInventoryItem * item_to_remove = gInventory.getItem(id_to_remove); -	if (!item_to_remove) return; - -	switch (item_to_remove->getType()) +	if (ids_to_remove.empty())  	{ -		case LLAssetType::AT_CLOTHING: -			if (get_is_item_worn(id_to_remove)) -			{ -				//*TODO move here the exact removing code from LLWearableBridge::removeItemFromAvatar in the future -				LLWearableBridge::removeItemFromAvatar(item_to_remove); -			} -			break; -		case LLAssetType::AT_OBJECT: -			LLVOAvatarSelf::detachAttachmentIntoInventory(item_to_remove->getLinkedUUID()); -		default: -			break; +		llwarns << "called with empty list, nothing to do" << llendl; +	} +	for (uuid_vec_t::const_iterator it = ids_to_remove.begin(); it != ids_to_remove.end(); ++it) +	{ +		const LLUUID& id_to_remove = *it; +		const LLUUID& linked_item_id = gInventory.getLinkedItemID(id_to_remove); +		removeCOFItemLinks(linked_item_id);  	} +	updateAppearanceFromCOF(); +} -	// *HACK: Force to remove garbage from COF. -	// Unworn links or objects can't be processed by existed removing functionality -	// since it is not designed for such cases. As example attachment object can't be removed -	// since sever don't sends message _PREHASH_KillObject in that case. -	// Also we can't check is link was successfully removed from COF since in case -	// deleting attachment link removing performs asynchronously in process_kill_object callback. -	removeCOFItemLinks(id_to_remove,false); +void LLAppearanceMgr::removeItemFromAvatar(const LLUUID& id_to_remove) +{ +	LLUUID linked_item_id = gInventory.getLinkedItemID(id_to_remove); +	removeCOFItemLinks(linked_item_id); +	updateAppearanceFromCOF();  }  bool LLAppearanceMgr::moveWearable(LLViewerInventoryItem* item, bool closer_to_body) @@ -2795,7 +2882,8 @@ LLAppearanceMgr::LLAppearanceMgr():  	mAttachmentInvLinkEnabled(false),  	mOutfitIsDirty(false),  	mOutfitLocked(false), -	mIsInUpdateAppearanceFromCOF(false) +	mIsInUpdateAppearanceFromCOF(false), +	mLastUpdateRequestCOFVersion(LLViewerInventoryCategory::VERSION_UNKNOWN)  {  	LLOutfitObserver& outfit_observer = LLOutfitObserver::instance(); @@ -2859,7 +2947,7 @@ void LLAppearanceMgr::unregisterAttachment(const LLUUID& item_id)  	   if (mAttachmentInvLinkEnabled)  	   { -		   LLAppearanceMgr::removeCOFItemLinks(item_id, false); +		   LLAppearanceMgr::removeCOFItemLinks(item_id);  	   }  	   else  	   { diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index c1d561781d..d6187e1cfb 100644..100755 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -93,6 +93,9 @@ public:  	// Find the Current Outfit folder.  	const LLUUID getCOF() const; +	S32 getCOFVersion() const; + +	S32 mLastUpdateRequestCOFVersion;  	// Finds the folder link to the currently worn outfit  	const LLViewerInventoryItem *getBaseOutfitLink(); @@ -130,8 +133,10 @@ public:  	void addCOFItemLink(const LLInventoryItem *item, bool do_update = true, LLPointer<LLInventoryCallback> cb = NULL);  	// Remove COF entries -	void removeCOFItemLinks(const LLUUID& item_id, bool do_update = true); -	void removeCOFLinksOfType(LLWearableType::EType type, bool do_update = true); +	void removeCOFItemLinks(const LLUUID& item_id); +	void removeCOFLinksOfType(LLWearableType::EType type); +	void removeAllClothesFromAvatar(); +	void removeAllAttachmentsFromAvatar();  	// Add COF link to ensemble folder.  	void addEnsembleLink(LLInventoryCategory* item, bool do_update = true); @@ -162,6 +167,7 @@ public:  	bool updateBaseOutfit();  	//Remove clothing or detach an object from the agent (a bodypart cannot be removed) +	void removeItemsFromAvatar(const uuid_vec_t& item_ids);  	void removeItemFromAvatar(const LLUUID& item_id); @@ -182,6 +188,8 @@ public:  	bool isInUpdateAppearanceFromCOF() { return mIsInUpdateAppearanceFromCOF; } +	void requestServerAppearanceUpdate(); +  protected:  	LLAppearanceMgr();  	~LLAppearanceMgr(); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index c9458857d1..6ca77ba4dd 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -636,7 +636,6 @@ LLAppViewer::LLAppViewer() :  	mForceGraphicsDetail(false),  	mQuitRequested(false),  	mLogoutRequestSent(false), -	mYieldTime(-1),  	mMainloopTimeout(NULL),  	mAgentRegionLastAlive(false),  	mRandomizeFramerate(LLCachedControl<bool>(gSavedSettings,"Randomize Framerate", FALSE)), @@ -1207,7 +1206,7 @@ bool LLAppViewer::mainLoop()  	LLVoiceChannel::initClass();  	LLVoiceClient::getInstance()->init(gServicePump);  	LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::sOnCurrentChannelChanged, _1), true); -	LLTimer frameTimer,idleTimer; +	LLTimer frameTimer,idleTimer,periodicRenderingTimer;  	LLTimer debugTime;  	LLViewerJoystick* joystick(LLViewerJoystick::getInstance());  	joystick->setNeedsReset(true); @@ -1219,6 +1218,8 @@ bool LLAppViewer::mainLoop()      // point of posting.      LLSD newFrame; +	BOOL restore_rendering_masks = FALSE; +  	//LLPrivateMemoryPoolTester::getInstance()->run(false) ;  	//LLPrivateMemoryPoolTester::getInstance()->run(true) ;  	//LLPrivateMemoryPoolTester::destroy() ; @@ -1236,6 +1237,28 @@ bool LLAppViewer::mainLoop()  		try  		{ +			// Check if we need to restore rendering masks. +			if (restore_rendering_masks) +			{ +				gPipeline.popRenderDebugFeatureMask(); +				gPipeline.popRenderTypeMask(); +			} +			// Check if we need to temporarily enable rendering. +			F32 periodic_rendering = gSavedSettings.getF32("ForcePeriodicRenderingTime"); +			if (periodic_rendering > F_APPROXIMATELY_ZERO && periodicRenderingTimer.getElapsedTimeF64() > periodic_rendering) +			{ +				periodicRenderingTimer.reset(); +				restore_rendering_masks = TRUE; +				gPipeline.pushRenderTypeMask(); +				gPipeline.pushRenderDebugFeatureMask(); +				gPipeline.setAllRenderTypes(); +				gPipeline.setAllRenderDebugFeatures(); +			} +			else +			{ +				restore_rendering_masks = FALSE; +			} +  			pingMainloopTimeout("Main:MiscNativeWindowEvents");  			if (gViewerWindow) @@ -1358,10 +1381,11 @@ bool LLAppViewer::mainLoop()  				LLFastTimer t2(FTM_SLEEP);  				// yield some time to the os based on command line option -				if(mYieldTime >= 0) +				S32 yield_time = gSavedSettings.getS32("YieldTime"); +				if(yield_time >= 0)  				{  					LLFastTimer t(FTM_YIELD); -					ms_sleep(mYieldTime); +					ms_sleep(yield_time);  				}  				// yield cooperatively when not running as foreground window @@ -1473,6 +1497,26 @@ bool LLAppViewer::mainLoop()  				{  					gFrameStalls++;  				} + +				// Limit FPS +				F32 max_fps = gSavedSettings.getF32("MaxFPS"); +				// Only limit FPS when we are actually rendering something.  Otherwise +				// logins, logouts and teleports take much longer to complete. +				if (max_fps > F_APPROXIMATELY_ZERO &&  +					LLStartUp::getStartupState() == STATE_STARTED && +					!gTeleportDisplay && +					!logoutRequestSent()) +				{ +					// Sleep a while to limit frame rate. +					F32 min_frame_time = 1.f / max_fps; +					S32 milliseconds_to_sleep = llclamp((S32)((min_frame_time - frameTimer.getElapsedTimeF64()) * 1000.f), 0, 1000); +					if (milliseconds_to_sleep > 0) +					{ +						LLFastTimer t(FTM_YIELD); +						ms_sleep(milliseconds_to_sleep); +					} +				} +  				frameTimer.reset();  				resumeMainloopTimeout(); @@ -2587,8 +2631,6 @@ bool LLAppViewer::initConfiguration()  		}  	} -    mYieldTime = gSavedSettings.getS32("YieldTime"); -  	// Read skin/branding settings if specified.  	//if (! gDirUtilp->getSkinDir().empty() )  	//{ diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index ae3c795d1e..043893020b 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -253,7 +253,6 @@ 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;  	struct SettingsFiles* mSettingsLocationList;  	LLWatchdogTimeout* mMainloopTimeout; diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp index e9c7a3fa03..e86d6930e8 100644..100755 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -139,8 +139,7 @@ protected:  	{  		LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; -		functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1); -		registrar.add("Attachment.Detach", boost::bind(handleMultiple, take_off, mUUIDs)); +		registrar.add("Attachment.Detach", boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs));  		return createFromFile("menu_cof_attachment.xml");  	} @@ -173,9 +172,8 @@ protected:  		LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;  		LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;  		LLUUID selected_id = mUUIDs.back(); -		functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1); -		registrar.add("Clothing.TakeOff", boost::bind(handleMultiple, take_off, mUUIDs)); +		registrar.add("Clothing.TakeOff", boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs));  		registrar.add("Clothing.Replace", boost::bind(replaceWearable, selected_id));  		registrar.add("Clothing.Edit", boost::bind(LLAgentWearables::editWearable, selected_id));  		registrar.add("Clothing.Create", boost::bind(&CofClothingContextMenu::createNew, this, selected_id)); diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp index fa42b157a7..fa42b157a7 100644..100755 --- a/indra/newview/lldynamictexture.cpp +++ b/indra/newview/lldynamictexture.cpp diff --git a/indra/newview/llestateinfomodel.cpp b/indra/newview/llestateinfomodel.cpp index 7ed22d68f6..0faa888398 100644 --- a/indra/newview/llestateinfomodel.cpp +++ b/indra/newview/llestateinfomodel.cpp @@ -65,12 +65,12 @@ void LLEstateInfoModel::sendEstateInfo()  	}  } -bool LLEstateInfoModel::getUseFixedSun()			const {	return mFlags & REGION_FLAGS_SUN_FIXED;				} -bool LLEstateInfoModel::getIsExternallyVisible()	const {	return mFlags & REGION_FLAGS_EXTERNALLY_VISIBLE;	} -bool LLEstateInfoModel::getAllowDirectTeleport()	const {	return mFlags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT;	} -bool LLEstateInfoModel::getDenyAnonymous()			const {	return mFlags & REGION_FLAGS_DENY_ANONYMOUS; 		} -bool LLEstateInfoModel::getDenyAgeUnverified()		const {	return mFlags & REGION_FLAGS_DENY_AGEUNVERIFIED;	} -bool LLEstateInfoModel::getAllowVoiceChat()			const {	return mFlags & REGION_FLAGS_ALLOW_VOICE;			} +bool LLEstateInfoModel::getUseFixedSun()			const {	return getFlag(REGION_FLAGS_SUN_FIXED);				} +bool LLEstateInfoModel::getIsExternallyVisible()	const {	return getFlag(REGION_FLAGS_EXTERNALLY_VISIBLE);	} +bool LLEstateInfoModel::getAllowDirectTeleport()	const {	return getFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT);	} +bool LLEstateInfoModel::getDenyAnonymous()			const {	return getFlag(REGION_FLAGS_DENY_ANONYMOUS); 		} +bool LLEstateInfoModel::getDenyAgeUnverified()		const {	return getFlag(REGION_FLAGS_DENY_AGEUNVERIFIED);	} +bool LLEstateInfoModel::getAllowVoiceChat()			const {	return getFlag(REGION_FLAGS_ALLOW_VOICE);			}  void LLEstateInfoModel::setUseFixedSun(bool val)			{ setFlag(REGION_FLAGS_SUN_FIXED, 				val);	}  void LLEstateInfoModel::setIsExternallyVisible(bool val)	{ setFlag(REGION_FLAGS_EXTERNALLY_VISIBLE,		val);	} @@ -199,18 +199,6 @@ void LLEstateInfoModel::commitEstateInfoDataserver()  	gAgent.sendMessage();  } -void LLEstateInfoModel::setFlag(U32 flag, bool val) -{ -	if (val) -	{ -		mFlags |= flag; -	} -	else -	{ -		mFlags &= ~flag; -	} -} -  std::string LLEstateInfoModel::getInfoDump()  {  	LLSD dump; diff --git a/indra/newview/llestateinfomodel.h b/indra/newview/llestateinfomodel.h index 56391eda91..538f2f7c75 100644 --- a/indra/newview/llestateinfomodel.h +++ b/indra/newview/llestateinfomodel.h @@ -85,19 +85,38 @@ protected:  private:  	bool commitEstateInfoCaps();  	void commitEstateInfoDataserver(); -	U32  getFlags() const { return mFlags; } -	void setFlag(U32 flag, bool val); +	inline bool getFlag(U64 flag) const; +	inline void setFlag(U64 flag, bool val); +	U64  getFlags() const { return mFlags; }  	std::string getInfoDump();  	// estate info  	std::string	mName;			/// estate name  	LLUUID		mOwnerID;		/// estate owner id  	U32			mID;			/// estate id -	U32			mFlags;			/// estate flags +	U64			mFlags;			/// estate flags  	F32			mSunHour;		/// estate sun hour  	update_signal_t mUpdateSignal; /// emitted when we receive update from sim  	update_signal_t mCommitSignal; /// emitted when our update gets applied to sim  }; +inline bool LLEstateInfoModel::getFlag(U64 flag) const +{ +	return ((mFlags & flag) != 0); +} + +inline void LLEstateInfoModel::setFlag(U64 flag, bool val) +{ +	if (val) +	{ +		mFlags |= flag; +	} +	else +	{ +		mFlags &= ~flag; +	} +} + +  #endif // LL_LLESTATEINFOMODEL_H diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp index 8223e89b64..42857b2aa2 100644 --- a/indra/newview/llfloaterbuyland.cpp +++ b/indra/newview/llfloaterbuyland.cpp @@ -538,7 +538,7 @@ void LLFloaterBuyLandUI::updateCovenantInfo()  	LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause");  	if (resellable_clause)  	{ -		if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) +		if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL))  		{  			resellable_clause->setText(getString("can_not_resell"));  		} @@ -551,7 +551,7 @@ void LLFloaterBuyLandUI::updateCovenantInfo()  	LLTextBox* changeable_clause = getChild<LLTextBox>("changeable_clause");  	if (changeable_clause)  	{ -		if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES) +		if (region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES))  		{  			changeable_clause->setText(getString("can_change"));  		} diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp index fb905eae11..ab56b8e3d6 100644 --- a/indra/newview/llfloatergodtools.cpp +++ b/indra/newview/llfloatergodtools.cpp @@ -164,9 +164,9 @@ LLFloaterGodTools::~LLFloaterGodTools()  } -U32 LLFloaterGodTools::computeRegionFlags() const +U64 LLFloaterGodTools::computeRegionFlags() const  { -	U32 flags = gAgent.getRegion()->getRegionFlags(); +	U64 flags = gAgent.getRegion()->getRegionFlags();  	if (mPanelRegionTools) flags = mPanelRegionTools->computeRegionFlags(flags);  	if (mPanelObjectTools) flags = mPanelObjectTools->computeRegionFlags(flags);  	return flags; @@ -210,7 +210,7 @@ void LLFloaterGodTools::processRegionInfo(LLMessageSystem* msg)  	if (!msg) return;  	//const S32 SIM_NAME_BUF = 256; -	U32 region_flags; +	U64 region_flags;  	U8 sim_access;  	U8 agent_limit;  	std::string sim_name; @@ -231,13 +231,23 @@ void LLFloaterGodTools::processRegionInfo(LLMessageSystem* msg)  	msg->getStringFast(_PREHASH_RegionInfo, _PREHASH_SimName, sim_name);  	msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_EstateID, estate_id);  	msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_ParentEstateID, parent_estate_id); -	msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_RegionFlags, region_flags);  	msg->getU8Fast(_PREHASH_RegionInfo, _PREHASH_SimAccess, sim_access);  	msg->getU8Fast(_PREHASH_RegionInfo, _PREHASH_MaxAgents, agent_limit);  	msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_ObjectBonusFactor, object_bonus_factor);  	msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_BillableFactor, billable_factor);  	msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_WaterHeight, water_height); +	if (msg->has(_PREHASH_RegionInfo3)) +	{ +		msg->getU64Fast(_PREHASH_RegionInfo3, _PREHASH_RegionFlagsExtended, region_flags); +	} +	else +	{ +		U32 flags = 0; +		msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_RegionFlags, flags); +		region_flags = flags; +	} +  	if (host != gAgent.getRegionHost())  	{  		// Update is for a different region than the one we're in. @@ -341,6 +351,7 @@ void LLFloaterGodTools::sendGodUpdateRegionInfo()  		LLMessageSystem *msg = gMessageSystem;  		LLPanelRegionTools *rtool = god_tools->mPanelRegionTools; +		U64 region_flags = computeRegionFlags();  		msg->newMessage("GodUpdateRegionInfo");  		msg->nextBlockFast(_PREHASH_AgentData);  		msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); @@ -349,11 +360,14 @@ void LLFloaterGodTools::sendGodUpdateRegionInfo()  		msg->addStringFast(_PREHASH_SimName, rtool->getSimName());  		msg->addU32Fast(_PREHASH_EstateID, rtool->getEstateID());  		msg->addU32Fast(_PREHASH_ParentEstateID, rtool->getParentEstateID()); -		msg->addU32Fast(_PREHASH_RegionFlags, computeRegionFlags()); +		// Legacy flags +		msg->addU32Fast(_PREHASH_RegionFlags, U32(region_flags));  		msg->addF32Fast(_PREHASH_BillableFactor, rtool->getBillableFactor());  		msg->addS32Fast(_PREHASH_PricePerMeter, rtool->getPricePerMeter());  		msg->addS32Fast(_PREHASH_RedirectGridX, rtool->getRedirectGridX());  		msg->addS32Fast(_PREHASH_RedirectGridY, rtool->getRedirectGridY()); +		msg->nextBlockFast(_PREHASH_RegionInfo2); +		msg->addU64Fast(_PREHASH_RegionFlagsExtended, region_flags);  		gAgent.sendReliableMessage();  	} @@ -434,7 +448,7 @@ LLPanelRegionTools::~LLPanelRegionTools()  	// base class will take care of everything  } -U32 LLPanelRegionTools::computeRegionFlags(U32 flags) const +U64 LLPanelRegionTools::computeRegionFlags(U64 flags) const  {  	flags &= getRegionFlagsMask();  	flags |= getRegionFlags(); @@ -562,9 +576,9 @@ S32 LLPanelRegionTools::getGridPosY() const  	return getChild<LLUICtrl>("gridposy")->getValue().asInteger();  } -U32 LLPanelRegionTools::getRegionFlags() const +U64 LLPanelRegionTools::getRegionFlags() const  { -	U32 flags = 0x0; +	U64 flags = 0x0;  	flags = getChild<LLUICtrl>("check prelude")->getValue().asBoolean()    					? set_prelude_flags(flags)  					: unset_prelude_flags(flags); @@ -601,9 +615,9 @@ U32 LLPanelRegionTools::getRegionFlags() const  	return flags;  } -U32 LLPanelRegionTools::getRegionFlagsMask() const +U64 LLPanelRegionTools::getRegionFlagsMask() const  { -	U32 flags = 0xffffffff; +	U64 flags = 0xFFFFFFFFFFFFFFFFULL;  	flags = getChild<LLUICtrl>("check prelude")->getValue().asBoolean()  				? set_prelude_flags(flags)  				: unset_prelude_flags(flags); @@ -684,7 +698,7 @@ void LLPanelRegionTools::setParentEstateID(U32 id)  	getChild<LLUICtrl>("parentestate")->setValue((S32)id);  } -void LLPanelRegionTools::setCheckFlags(U32 flags) +void LLPanelRegionTools::setCheckFlags(U64 flags)  {  	getChild<LLUICtrl>("check prelude")->setValue(is_prelude(flags) ? TRUE : FALSE);  	getChild<LLUICtrl>("check fixed sun")->setValue(flags & REGION_FLAGS_SUN_FIXED ? TRUE : FALSE); @@ -943,7 +957,7 @@ void LLPanelObjectTools::refresh()  } -U32 LLPanelObjectTools::computeRegionFlags(U32 flags) const +U64 LLPanelObjectTools::computeRegionFlags(U64 flags) const  {  	if (getChild<LLUICtrl>("disable scripts")->getValue().asBoolean())  	{ @@ -973,7 +987,7 @@ U32 LLPanelObjectTools::computeRegionFlags(U32 flags) const  } -void LLPanelObjectTools::setCheckFlags(U32 flags) +void LLPanelObjectTools::setCheckFlags(U64 flags)  {  	getChild<LLUICtrl>("disable scripts")->setValue(flags & REGION_FLAGS_SKIP_SCRIPTS ? TRUE : FALSE);  	getChild<LLUICtrl>("disable collisions")->setValue(flags & REGION_FLAGS_SKIP_COLLISIONS ? TRUE : FALSE); diff --git a/indra/newview/llfloatergodtools.h b/indra/newview/llfloatergodtools.h index 1aa8b838fb..cbaeee7051 100644 --- a/indra/newview/llfloatergodtools.h +++ b/indra/newview/llfloatergodtools.h @@ -98,7 +98,7 @@ private:  	~LLFloaterGodTools();  protected: -	U32 computeRegionFlags() const; +	U64 computeRegionFlags() const;  protected: @@ -147,8 +147,8 @@ public:  	const std::string getSimName() const;  	U32 getEstateID() const;  	U32 getParentEstateID() const; -	U32 getRegionFlags() const; -	U32 getRegionFlagsMask() const; +	U64 getRegionFlags() const; +	U64 getRegionFlagsMask() const;  	F32 getBillableFactor() const;  	S32 getPricePerMeter() const;  	S32 getGridPosX() const; @@ -160,7 +160,7 @@ public:  	void setSimName(const std::string& name);  	void setEstateID(U32 id);  	void setParentEstateID(U32 id); -	void setCheckFlags(U32 flags); +	void setCheckFlags(U64 flags);  	void setBillableFactor(F32 billable_factor);  	void setPricePerMeter(S32 price);  	void setGridPosX(S32 pos); @@ -168,7 +168,7 @@ public:  	void setRedirectGridX(S32 pos);  	void setRedirectGridY(S32 pos); -	U32 computeRegionFlags(U32 initial_flags) const; +	U64 computeRegionFlags(U64 initial_flags) const;  	void clearAllWidgets();  	void enableAllWidgets(); @@ -218,10 +218,10 @@ public:  	/*virtual*/ void refresh();  	void setTargetAvatar(const LLUUID& target_id); -	U32 computeRegionFlags(U32 initial_flags) const; +	U64 computeRegionFlags(U64 initial_flags) const;  	void clearAllWidgets();  	void enableAllWidgets(); -	void setCheckFlags(U32 flags); +	void setCheckFlags(U64 flags);  	void onChangeAnything();  	void onApplyChanges(); diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 55f3d548ec..ce95d8bacf 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -557,7 +557,7 @@ void LLPanelLandGeneral::refresh()  		BOOL is_leased = (LLParcel::OS_LEASED == parcel->getOwnershipStatus());  		BOOL region_xfer = FALSE;  		if(regionp -		   && !(regionp->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL)) +		   && !(regionp->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL)))  		{  			region_xfer = TRUE;  		} @@ -2117,7 +2117,7 @@ void LLPanelLandOptions::refreshSearch()  			LLViewerParcelMgr::isParcelModifiableByAgent(  				parcel, GP_LAND_CHANGE_IDENTITY)  			&& region -			&& !(region->getRegionFlags() & REGION_FLAGS_BLOCK_PARCEL_SEARCH); +			&& !(region->getRegionFlag(REGION_FLAGS_BLOCK_PARCEL_SEARCH));  	// There is a bug with this panel whereby the Show Directory bit can be   	// slammed off by the Region based on an override.  Since this data is cached @@ -2866,7 +2866,7 @@ void LLPanelLandCovenant::refresh()  	LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause");  	if (resellable_clause)  	{ -		if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) +		if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL))  		{  			resellable_clause->setText(getString("can_not_resell"));  		} @@ -2879,7 +2879,7 @@ void LLPanelLandCovenant::refresh()  	LLTextBox* changeable_clause = getChild<LLTextBox>("changeable_clause");  	if (changeable_clause)  	{ -		if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES) +		if (region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES))  		{  			changeable_clause->setText(getString("can_change"));  		} diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index fe29bb38c7..a36021f971 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -318,7 +318,7 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)  	// extract message  	std::string sim_name;  	std::string sim_type = LLTrans::getString("land_type_unknown"); -	U32 region_flags; +	U64 region_flags;  	U8 agent_limit;  	F32 object_bonus_factor;  	U8 sim_access; @@ -328,7 +328,6 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)  	BOOL use_estate_sun;  	F32 sun_hour;  	msg->getString("RegionInfo", "SimName", sim_name); -	msg->getU32("RegionInfo", "RegionFlags", region_flags);  	msg->getU8("RegionInfo", "MaxAgents", agent_limit);  	msg->getF32("RegionInfo", "ObjectBonusFactor", object_bonus_factor);  	msg->getU8("RegionInfo", "SimAccess", sim_access); @@ -347,6 +346,17 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)  		LLTrans::findString(sim_type, sim_type); // try localizing sim product name  	} +	if (msg->has(_PREHASH_RegionInfo3)) +	{ +		msg->getU64("RegionInfo3", "RegionFlagsExtended", region_flags); +	} +	else +	{ +		U32 flags = 0; +		msg->getU32("RegionInfo", "RegionFlags", flags); +		region_flags = flags; +	} +  	// GENERAL PANEL  	panel = tab->getChild<LLPanel>("General");  	panel->getChild<LLUICtrl>("region_text")->setValue(LLSD(sim_name)); @@ -378,9 +388,9 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)  	panel = tab->getChild<LLPanel>("Debug");  	panel->getChild<LLUICtrl>("region_text")->setValue(LLSD(sim_name) ); -	panel->getChild<LLUICtrl>("disable_scripts_check")->setValue(LLSD((BOOL)(region_flags & REGION_FLAGS_SKIP_SCRIPTS)) ); -	panel->getChild<LLUICtrl>("disable_collisions_check")->setValue(LLSD((BOOL)(region_flags & REGION_FLAGS_SKIP_COLLISIONS)) ); -	panel->getChild<LLUICtrl>("disable_physics_check")->setValue(LLSD((BOOL)(region_flags & REGION_FLAGS_SKIP_PHYSICS)) ); +	panel->getChild<LLUICtrl>("disable_scripts_check")->setValue(LLSD((BOOL)((region_flags & REGION_FLAGS_SKIP_SCRIPTS) ? TRUE : FALSE )) ); +	panel->getChild<LLUICtrl>("disable_collisions_check")->setValue(LLSD((BOOL)((region_flags & REGION_FLAGS_SKIP_COLLISIONS) ? TRUE : FALSE )) ); +	panel->getChild<LLUICtrl>("disable_physics_check")->setValue(LLSD((BOOL)((region_flags & REGION_FLAGS_SKIP_PHYSICS) ? TRUE : FALSE )) );  	panel->setCtrlsEnabled(allow_modify);  	// TERRAIN PANEL @@ -2276,7 +2286,7 @@ bool LLPanelEstateCovenant::refreshFromRegion(LLViewerRegion* region)  	LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause");  	if (resellable_clause)  	{ -		if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) +		if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL))  		{  			resellable_clause->setText(getString("can_not_resell"));  		} @@ -2289,7 +2299,7 @@ bool LLPanelEstateCovenant::refreshFromRegion(LLViewerRegion* region)  	LLTextBox* changeable_clause = getChild<LLTextBox>("changeable_clause");  	if (changeable_clause)  	{ -		if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES) +		if (region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES))  		{  			changeable_clause->setText(getString("can_change"));  		} diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 3ec1e372eb..479bdd5ff7 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -110,9 +110,6 @@ LLFloaterReporter::LLFloaterReporter(const LLSD& key)  // static  void LLFloaterReporter::processRegionInfo(LLMessageSystem* msg)  { -	U32 region_flags; -	msg->getU32("RegionInfo", "RegionFlags", region_flags); -	  	if ( LLFloaterReg::instanceVisible("reporter") )  	{  		LLNotificationsUtil::add("HelpReportAbuseEmailLL"); diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp index 5385977d95..3c966a073f 100644..100755 --- a/indra/newview/llfloatersidepanelcontainer.cpp +++ b/indra/newview/llfloatersidepanelcontainer.cpp @@ -32,6 +32,8 @@  // newview includes  #include "llsidetraypanelcontainer.h"  #include "lltransientfloatermgr.h" +#include "llpaneloutfitedit.h" +#include "llsidepanelappearance.h"  //static  const std::string LLFloaterSidePanelContainer::sMainPanelName("main_panel"); @@ -54,6 +56,26 @@ void LLFloaterSidePanelContainer::onOpen(const LLSD& key)  	getChild<LLPanel>(sMainPanelName)->onOpen(key);  } +void LLFloaterSidePanelContainer::onClickCloseBtn() +{ +	llinfos << "close clicked" << llendl; + +	LLPanelOutfitEdit* panel_outfit_edit = +		dynamic_cast<LLPanelOutfitEdit*>(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfit_edit")); +	if (panel_outfit_edit && panel_outfit_edit->getVisible()) +	{ +		LLFloater *parent = gFloaterView->getParentFloater(panel_outfit_edit); +		if (parent == this) +		{ +			LLSidepanelAppearance* panel_appearance = +				dynamic_cast<LLSidepanelAppearance*>(getPanel("appearance")); +			panel_appearance->showOutfitsInventoryPanel(); +		} +	} + +	LLFloater::onClickCloseBtn(); +} +  LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_name, const LLSD& params)  {  	LLView* view = findChildView(panel_name, true); diff --git a/indra/newview/llfloatersidepanelcontainer.h b/indra/newview/llfloatersidepanelcontainer.h index 10d85867ce..491723471f 100644..100755 --- a/indra/newview/llfloatersidepanelcontainer.h +++ b/indra/newview/llfloatersidepanelcontainer.h @@ -51,6 +51,8 @@ public:  	/*virtual*/ void onOpen(const LLSD& key); +	/*virtual*/ void onClickCloseBtn(); +  	LLPanel* openChildPanel(const std::string& panel_name, const LLSD& params);  	static void showPanel(const std::string& floater_name, const LLSD& key); diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index 66ca76bfb0..05fd9640c8 100644 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -337,7 +337,7 @@ void LLGestureMgr::deactivateGesture(const LLUUID& item_id)  	gAgent.sendReliableMessage(); -	LLAppearanceMgr::instance().removeCOFItemLinks(base_item_id, false); +	LLAppearanceMgr::instance().removeCOFItemLinks(base_item_id);  	notifyObservers();  } diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index fce0b7c9c9..ddeb33d0ba 100644..100755 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -110,8 +110,6 @@ void dec_busy_count()  }  // Function declarations -void remove_inventory_category_from_avatar(LLInventoryCategory* category); -void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id);  bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*);  bool confirm_attachment_rez(const LLSD& notification, const LLSD& response);  void teleport_via_landmark(const LLUUID& asset_id); @@ -2790,7 +2788,7 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)  		LLViewerInventoryCategory* cat = getCategory();  		if(!cat) return; -		remove_inventory_category_from_avatar ( cat ); +		LLAppearanceMgr::instance().takeOffOutfit( cat->getLinkedUUID() );  		return;  	}  	else if ("purge" == action) @@ -5101,11 +5099,7 @@ void LLObjectBridge::performAction(LLInventoryModel* model, std::string action)  	}  	else if (isRemoveAction(action))  	{ -		LLInventoryItem* item = gInventory.getItem(mUUID); -		if(item) -		{ -			LLVOAvatarSelf::detachAttachmentIntoInventory(item->getLinkedUUID()); -		} +		LLAppearanceMgr::instance().removeItemFromAvatar(mUUID);  	}  	else LLItemBridge::performAction(model, action);  } @@ -5397,120 +5391,6 @@ LLWearableBridge::LLWearableBridge(LLInventoryPanel* inventory,  	mInvType = inv_type;  } -void remove_inventory_category_from_avatar( LLInventoryCategory* category ) -{ -	if(!category) return; -	lldebugs << "remove_inventory_category_from_avatar( " << category->getName() -			 << " )" << llendl; - - -	if (gAgentCamera.cameraCustomizeAvatar()) -	{ -		// switching to outfit editor should automagically save any currently edited wearable -		LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "edit_outfit")); -	} - -	remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() ); -} - -struct OnRemoveStruct -{ -	LLUUID mUUID; -	OnRemoveStruct(const LLUUID& uuid): -		mUUID(uuid) -	{ -	} -}; - -void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id) -{ - -	// Find all the wearables that are in the category's subtree. -	lldebugs << "remove_inventory_category_from_avatar_step2()" << llendl; -	if(proceed) -	{ -		LLInventoryModel::cat_array_t cat_array; -		LLInventoryModel::item_array_t item_array; -		LLFindWearables is_wearable; -		gInventory.collectDescendentsIf(category_id, -										cat_array, -										item_array, -										LLInventoryModel::EXCLUDE_TRASH, -										is_wearable); -		S32 i; -		S32 wearable_count = item_array.count(); - -		LLInventoryModel::cat_array_t	obj_cat_array; -		LLInventoryModel::item_array_t	obj_item_array; -		LLIsType is_object( LLAssetType::AT_OBJECT ); -		gInventory.collectDescendentsIf(category_id, -										obj_cat_array, -										obj_item_array, -										LLInventoryModel::EXCLUDE_TRASH, -										is_object); -		S32 obj_count = obj_item_array.count(); - -		// Find all gestures in this folder -		LLInventoryModel::cat_array_t	gest_cat_array; -		LLInventoryModel::item_array_t	gest_item_array; -		LLIsType is_gesture( LLAssetType::AT_GESTURE ); -		gInventory.collectDescendentsIf(category_id, -										gest_cat_array, -										gest_item_array, -										LLInventoryModel::EXCLUDE_TRASH, -										is_gesture); -		S32 gest_count = gest_item_array.count(); - -		if (wearable_count > 0)	//Loop through wearables.  If worn, remove. -		{ -			for(i = 0; i  < wearable_count; ++i) -			{ -				LLViewerInventoryItem *item = item_array.get(i); -				if (item->getType() == LLAssetType::AT_BODYPART) -					continue; -				if (gAgent.isTeen() && item->isWearableType() && -					(item->getWearableType() == LLWearableType::WT_UNDERPANTS || item->getWearableType() == LLWearableType::WT_UNDERSHIRT)) -					continue; -				if (get_is_item_worn(item->getUUID())) -				{ -					LLWearableList::instance().getAsset(item->getAssetUUID(), -														item->getName(), -														item->getType(), -														LLWearableBridge::onRemoveFromAvatarArrived, -														new OnRemoveStruct(item->getLinkedUUID())); -				} -			} -		} - -		if (obj_count > 0) -		{ -			for(i = 0; i  < obj_count; ++i) -			{ -				LLViewerInventoryItem *obj_item = obj_item_array.get(i); -				if (get_is_item_worn(obj_item->getUUID())) -				{ -					LLVOAvatarSelf::detachAttachmentIntoInventory(obj_item->getLinkedUUID()); -				} -			} -		} - -		if (gest_count > 0) -		{ -			for(i = 0; i  < gest_count; ++i) -			{ -				LLViewerInventoryItem *gest_item = gest_item_array.get(i); -				if (get_is_item_worn(gest_item->getUUID())) -				{ -					LLGestureMgr::instance().deactivateGesture( gest_item->getLinkedUUID() ); -					gInventory.updateItem( gest_item ); -					gInventory.notifyObservers(); -				} - -			} -		} -	} -} -  BOOL LLWearableBridge::renameItem(const std::string& new_name)  {  	if (get_is_item_worn(mUUID)) @@ -5806,95 +5686,12 @@ BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data)  	return FALSE;  } -// static -void LLWearableBridge::onRemoveFromAvatar(void* user_data) -{ -	LLWearableBridge* self = (LLWearableBridge*)user_data; -	if(!self) return; -	if(get_is_item_worn(self->mUUID)) -	{ -		LLViewerInventoryItem* item = self->getItem(); -		if (item) -		{ -			LLUUID parent_id = item->getParentUUID(); -			LLWearableList::instance().getAsset(item->getAssetUUID(), -												item->getName(), -												item->getType(), -												onRemoveFromAvatarArrived, -												new OnRemoveStruct(LLUUID(self->mUUID))); -		} -	} -} - -// static -void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable, -												 void* userdata) -{ -	OnRemoveStruct *on_remove_struct = (OnRemoveStruct*) userdata; -	const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID); -	if(wearable) -	{ -		if( get_is_item_worn( item_id ) ) -		{ -			LLWearableType::EType type = wearable->getType(); - -			if( !(type==LLWearableType::WT_SHAPE || type==LLWearableType::WT_SKIN || type==LLWearableType::WT_HAIR || type==LLWearableType::WT_EYES ) ) //&& -				//!((!gAgent.isTeen()) && ( type==LLWearableType::WT_UNDERPANTS || type==LLWearableType::WT_UNDERSHIRT )) ) -			{ -				bool do_remove_all = false; -				U32 index = gAgentWearables.getWearableIndex(wearable); -				gAgentWearables.removeWearable( type, do_remove_all, index ); -			} -		} -	} - -	// Find and remove this item from the COF. -	LLAppearanceMgr::instance().removeCOFItemLinks(item_id,false); -	gInventory.notifyObservers(); - -	delete on_remove_struct; -} - -// static -void LLWearableBridge::removeAllClothesFromAvatar() -{ -	// Fetch worn clothes (i.e. the ones in COF). -	LLInventoryModel::item_array_t clothing_items; -	LLInventoryModel::cat_array_t dummy; -	LLIsType is_clothing(LLAssetType::AT_CLOTHING); -	gInventory.collectDescendentsIf(LLAppearanceMgr::instance().getCOF(), -									dummy, -									clothing_items, -									LLInventoryModel::EXCLUDE_TRASH, -									is_clothing, -									false); - -	// Take them off by removing from COF. -	for (LLInventoryModel::item_array_t::const_iterator it = clothing_items.begin(); it != clothing_items.end(); ++it) -	{ -		LLAppearanceMgr::instance().removeItemFromAvatar((*it)->getUUID()); -	} -} - -// static -void LLWearableBridge::removeItemFromAvatar(LLViewerInventoryItem *item) -{ -	if (item) -	{ -		LLWearableList::instance().getAsset(item->getAssetUUID(), -											item->getName(), -											item->getType(), -											LLWearableBridge::onRemoveFromAvatarArrived, -											new OnRemoveStruct(item->getUUID())); -	} -} -  void LLWearableBridge::removeFromAvatar()  { +	llwarns << "safe to remove?" << llendl;  	if (get_is_item_worn(mUUID))  	{ -		LLViewerInventoryItem* item = getItem(); -		removeItemFromAvatar(item); +		LLAppearanceMgr::instance().removeItemFromAvatar(mUUID);  	}  } diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 118430efe1..8f36234c39 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -498,9 +498,6 @@ public:  	void			editOnAvatar();  	static BOOL		canRemoveFromAvatar( void* userdata ); -	static void		onRemoveFromAvatar( void* userdata ); -	static void		onRemoveFromAvatarArrived( LLWearable* wearable, 	void* userdata ); -	static void 	removeItemFromAvatar(LLViewerInventoryItem *item);  	static void 	removeAllClothesFromAvatar();  	void			removeFromAvatar();  protected: diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 8d9d70b50e..5022dba934 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -1217,11 +1217,11 @@ void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon)  	case SCRIPTS_ICON:  	{  		LLViewerRegion* region = gAgent.getRegion(); -		if(region && region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) +		if(region && region->getRegionFlag(REGION_FLAGS_ESTATE_SKIP_SCRIPTS))  		{  			LLNotificationsUtil::add("ScriptsStopped");  		} -		else if(region && region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) +		else if(region && region->getRegionFlag(REGION_FLAGS_SKIP_SCRIPTS))  		{  			LLNotificationsUtil::add("ScriptsNotRunning");  		} diff --git a/indra/newview/llmorphview.cpp b/indra/newview/llmorphview.cpp index eaa044cb59..252d1b78ea 100644 --- a/indra/newview/llmorphview.cpp +++ b/indra/newview/llmorphview.cpp @@ -99,8 +99,6 @@ void	LLMorphView::initialize()  //-----------------------------------------------------------------------------  void	LLMorphView::shutdown()  { -	LLVOAvatarSelf::onCustomizeEnd(); -  	if (isAgentAvatarValid())  	{  		gAgentAvatarp->startMotion( ANIM_AGENT_BODY_NOISE ); diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index d58d6d536c..d8ba2aa659 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -1044,7 +1044,7 @@ void LLPanelEditWearable::saveChanges(bool force_save_as)          if (force_save_as)          {                  // the name of the wearable has changed, re-save wearable with new name -                LLAppearanceMgr::instance().removeCOFItemLinks(mWearablePtr->getItemID(),false); +                LLAppearanceMgr::instance().removeCOFItemLinks(mWearablePtr->getItemID());                  gAgentWearables.saveWearableAs(mWearablePtr->getType(), index, new_name, FALSE);                  mNameEditor->setText(mWearableItem->getName());          } diff --git a/indra/newview/llpanelland.cpp b/indra/newview/llpanelland.cpp index 04c1a86f69..5321ebc777 100644 --- a/indra/newview/llpanelland.cpp +++ b/indra/newview/llpanelland.cpp @@ -166,7 +166,7 @@ void LLPanelLandInfo::refresh()  		getChildView("button abandon land")->setEnabled(owner_release || manager_releaseable || gAgent.isGodlike());  		// only mainland sims are subdividable by owner -		if (regionp->getRegionFlags() && REGION_FLAGS_ALLOW_PARCEL_CHANGES) +		if (regionp->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES))  		{  			getChildView("button subdivide land")->setEnabled(owner_divide || manager_divideable || gAgent.isGodlike());  		} diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index ce8057eead..884de65dd8 100644 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -572,7 +572,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,  		mTerraformLimitsText->setText(parcel->getAllowTerraform() ? on : off); -		if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES) +		if (region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES))  		{  			mSubdivideText->setText(getString("can_change"));  		} @@ -580,7 +580,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,  		{  			mSubdivideText->setText(getString("can_not_change"));  		} -		if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) +		if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL))  		{  			mResaleText->setText(getString("can_not_resell"));  		} diff --git a/indra/newview/llpaneltopinfobar.cpp b/indra/newview/llpaneltopinfobar.cpp index 280cc11179..fbd86df1f3 100644 --- a/indra/newview/llpaneltopinfobar.cpp +++ b/indra/newview/llpaneltopinfobar.cpp @@ -415,11 +415,11 @@ void LLPanelTopInfoBar::onParcelIconClick(EParcelIcon icon)  	case SCRIPTS_ICON:  	{  		LLViewerRegion* region = gAgent.getRegion(); -		if(region && region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) +		if(region && region->getRegionFlag(REGION_FLAGS_ESTATE_SKIP_SCRIPTS))  		{  			LLNotificationsUtil::add("ScriptsStopped");  		} -		else if(region && region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) +		else if(region && region->getRegionFlag(REGION_FLAGS_SKIP_SCRIPTS))  		{  			LLNotificationsUtil::add("ScriptsNotRunning");  		} diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp index 3b9934d4be..aa3ed22bee 100644..100755 --- a/indra/newview/llpanelwearing.cpp +++ b/indra/newview/llpanelwearing.cpp @@ -77,11 +77,7 @@ private:  	{  		uuid_vec_t selected_uuids;  		mPanelWearing->getSelectedItemsUUIDs(selected_uuids); - -		for (uuid_vec_t::const_iterator it=selected_uuids.begin(); it != selected_uuids.end(); ++it) -		{ -				LLAppearanceMgr::instance().removeItemFromAvatar(*it); -		} +		LLAppearanceMgr::instance().removeItemsFromAvatar(selected_uuids);  	}  	LLToggleableMenu*		mMenu; @@ -97,12 +93,11 @@ protected:  	{  		LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; -		functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1); -  		registrar.add("Wearing.Edit", boost::bind(&edit_outfit)); -		registrar.add("Wearing.TakeOff", boost::bind(handleMultiple, take_off, mUUIDs)); -		registrar.add("Wearing.Detach", boost::bind(handleMultiple, take_off, mUUIDs)); - +		registrar.add("Wearing.TakeOff", +					  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs)); +		registrar.add("Wearing.Detach",  +					  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs));  		LLContextMenu* menu = createFromFile("menu_wearing_tab.xml");  		updateMenuItemsVisibility(menu); diff --git a/indra/newview/llpipelinelistener.cpp b/indra/newview/llpipelinelistener.cpp new file mode 100644 index 0000000000..20759239bf --- /dev/null +++ b/indra/newview/llpipelinelistener.cpp @@ -0,0 +1,216 @@ +/** + * @file   llpipelinelistener.h + * @author Don Kjer + * @date   2012-07-09 + * @brief  Implementation for LLPipelineListener + *  + * $LicenseInfo:firstyear=2012&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2012, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +// Precompiled header +#include "llviewerprecompiledheaders.h" + +#include "llpipelinelistener.h" + +#include "pipeline.h" +#include "stringize.h" +#include <sstream> +#include "llviewermenu.h" + + +namespace { +	// Render Types +	void toggle_render_types_wrapper(LLSD const& request) +	{ +		for (LLSD::array_const_iterator iter = request["types"].beginArray(); +			iter != request["types"].endArray(); +			++iter) +		{ +			U32 render_type = render_type_from_string( iter->asString() ); +			if ( render_type != 0 ) +			{ +				LLPipeline::toggleRenderTypeControl( (void*) render_type ); +			} +		} +	} + +	void has_render_type_wrapper(LLSD const& request) +	{ +		LLEventAPI::Response response(LLSD(), request); +		U32 render_type = render_type_from_string( request["type"].asString() ); +		if ( render_type != 0 ) +		{ +			response["value"] = LLPipeline::hasRenderTypeControl( (void*) render_type ); +		} +		else +		{ +			response.error(STRINGIZE("unknown type '" << request["type"].asString() << "'")); +		} +	} + +	void disable_all_render_types_wrapper(LLSD const& request) +	{ +		gPipeline.clearAllRenderTypes(); +	} + +	void enable_all_render_types_wrapper(LLSD const& request) +	{ +		gPipeline.setAllRenderTypes(); +	} + +	// Render Features +	void toggle_render_features_wrapper(LLSD const& request) +	{ +		for (LLSD::array_const_iterator iter = request["features"].beginArray(); +			iter != request["features"].endArray(); +			++iter) +		{ +			U32 render_feature = feature_from_string( iter->asString() ); +			if ( render_feature != 0 ) +			{ +				LLPipeline::toggleRenderDebugControl( (void*) render_feature ); +			} +		} +	} + +	void has_render_feature_wrapper(LLSD const& request) +	{ +		LLEventAPI::Response response(LLSD(), request); +		U32 render_feature = feature_from_string( request["feature"].asString() ); +		if ( render_feature != 0 ) +		{ +			response["value"] = gPipeline.hasRenderDebugFeatureMask(render_feature); +		} +		else +		{ +			response.error(STRINGIZE("unknown feature '" << request["feature"].asString() << "'")); +		} +	} + +	void disable_all_render_features_wrapper(LLSD const& request) +	{ +		gPipeline.clearAllRenderDebugFeatures(); +	} + +	void enable_all_render_features_wrapper(LLSD const& request) +	{ +		gPipeline.setAllRenderDebugFeatures(); +	} + +	// Render Info Displays +	void toggle_info_displays_wrapper(LLSD const& request) +	{ +		for (LLSD::array_const_iterator iter = request["displays"].beginArray(); +			iter != request["displays"].endArray(); +			++iter) +		{ +			U32 info_display = info_display_from_string( iter->asString() ); +			if ( info_display != 0 ) +			{ +				LLPipeline::toggleRenderDebug( (void*) info_display ); +			} +		} +	} + +	void has_info_display_wrapper(LLSD const& request) +	{ +		LLEventAPI::Response response(LLSD(), request); +		U32 info_display = info_display_from_string( request["display"].asString() ); +		if ( info_display != 0 ) +		{ +			response["value"] = gPipeline.hasRenderDebugMask(info_display); +		} +		else +		{ +			response.error(STRINGIZE("unknown display '" << request["display"].asString() << "'")); +		} +	} + +	void disable_all_info_displays_wrapper(LLSD const& request) +	{ +		gPipeline.clearAllRenderDebugDisplays(); +	} + +	void enable_all_info_displays_wrapper(LLSD const& request) +	{ +		gPipeline.setAllRenderDebugDisplays(); +	} + +} + + +LLPipelineListener::LLPipelineListener(): +	LLEventAPI("LLPipeline", +			   "API to te rendering pipeline.") +{ +	// Render Types +	add("toggleRenderTypes", +		"Toggle rendering [\"types\"]:\n" +		"See: llviewermenu.cpp:render_type_from_string for list of available types.", +		&toggle_render_types_wrapper); +	add("hasRenderType", +		"Check if rendering [\"type\"] is enabled:\n" +		"See: llviewermenu.cpp:render_type_from_string for list of available types.", +		&has_render_type_wrapper, +		LLSDMap("reply", LLSD())); +	add("disableAllRenderTypes", +		"Turn off all rendering types.", +		&disable_all_render_types_wrapper); +	add("enableAllRenderTypes", +		"Turn on all rendering types.", +		&enable_all_render_types_wrapper); + +	// Render Features +	add("toggleRenderFeatures", +		"Toggle rendering [\"features\"]:\n" +		"See: llviewermenu.cpp:feature_from_string for list of available features.", +		&toggle_render_features_wrapper); +	add("hasRenderFeature", +		"Check if rendering [\"feature\"] is enabled:\n" +		"See: llviewermenu.cpp:render_feature_from_string for list of available features.", +		&has_render_feature_wrapper, +		LLSDMap("reply", LLSD())); +	add("disableAllRenderFeatures", +		"Turn off all rendering features.", +		&disable_all_render_features_wrapper); +	add("enableAllRenderFeatures", +		"Turn on all rendering features.", +		&enable_all_render_features_wrapper); + +	// Render Info Displays +	add("toggleRenderInfoDisplays", +		"Toggle info [\"displays\"]:\n" +		"See: llviewermenu.cpp:info_display_from_string for list of available displays.", +		&toggle_info_displays_wrapper); +	add("hasRenderInfoDisplay", +		"Check if info [\"display\"] is enabled:\n" +		"See: llviewermenu.cpp:info_display_from_string for list of available displays.", +		&has_info_display_wrapper, +		LLSDMap("reply", LLSD())); +	add("disableAllRenderInfoDisplays", +		"Turn off all info displays.", +		&disable_all_info_displays_wrapper); +	add("enableAllRenderInfoDisplays", +		"Turn on all info displays.", +		&enable_all_info_displays_wrapper); +} + diff --git a/indra/newview/llpipelinelistener.h b/indra/newview/llpipelinelistener.h new file mode 100644 index 0000000000..da1898e57b --- /dev/null +++ b/indra/newview/llpipelinelistener.h @@ -0,0 +1,41 @@ +/** + * @file   llpipelinelistener.h + * @author Don Kjer + * @date   2012-07-09 + * @brief  Wrap subset of LLPipeline API in event API + *  + * $LicenseInfo:firstyear=2012&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#if ! defined(LL_LLPIPELINELISTENER_H) +#define LL_LLPIPELINELISTENER_H + +#include "lleventapi.h" + +/// Listen on an LLEventPump with specified name for LLPipeline request events. +class LLPipelineListener: public LLEventAPI +{ +public: +	LLPipelineListener(); +}; + +#endif /* ! defined(LL_LLPIPELINELISTENER_H) */ diff --git a/indra/newview/llregioninfomodel.cpp b/indra/newview/llregioninfomodel.cpp index 698c4f9bb9..590e246482 100644 --- a/indra/newview/llregioninfomodel.cpp +++ b/indra/newview/llregioninfomodel.cpp @@ -119,7 +119,7 @@ void LLRegionInfoModel::sendRegionTerrain(const LLUUID& invoice) const  bool LLRegionInfoModel::getUseFixedSun() const  { -	return mRegionFlags & REGION_FLAGS_SUN_FIXED; +	return ((mRegionFlags & REGION_FLAGS_SUN_FIXED) != 0);  }  void LLRegionInfoModel::setUseFixedSun(bool fixed) @@ -141,7 +141,6 @@ void LLRegionInfoModel::update(LLMessageSystem* msg)  	msg->getStringFast(_PREHASH_RegionInfo, _PREHASH_SimName, mSimName);  	msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_EstateID, mEstateID);  	msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_ParentEstateID, mParentEstateID); -	msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_RegionFlags, mRegionFlags);  	msg->getU8Fast(_PREHASH_RegionInfo, _PREHASH_SimAccess, mSimAccess);  	msg->getU8Fast(_PREHASH_RegionInfo, _PREHASH_MaxAgents, mAgentLimit);  	msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_ObjectBonusFactor, mObjectBonusFactor); @@ -159,6 +158,17 @@ void LLRegionInfoModel::update(LLMessageSystem* msg)  	msg->getF32(_PREHASH_RegionInfo, _PREHASH_SunHour, mSunHour);  	LL_DEBUGS("Windlight Sync") << "Got region sun hour: " << mSunHour << LL_ENDL; +	if (msg->has(_PREHASH_RegionInfo3)) +	{ +		msg->getU64Fast(_PREHASH_RegionInfo3, _PREHASH_RegionFlagsExtended, mRegionFlags); +	} +	else +	{ +		U32 flags = 0; +		msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_RegionFlags, flags); +		mRegionFlags = flags; +	} +  	// the only reasonable way to decide if we actually have any data is to  	// check to see if any of these fields have nonzero sizes  	if (msg->getSize(_PREHASH_RegionInfo2, _PREHASH_ProductSKU) > 0 || diff --git a/indra/newview/llregioninfomodel.h b/indra/newview/llregioninfomodel.h index 89efd82767..d22a0de463 100644 --- a/indra/newview/llregioninfomodel.h +++ b/indra/newview/llregioninfomodel.h @@ -52,7 +52,7 @@ public:  	U8			mSimAccess;  	U8			mAgentLimit; -	U32			mRegionFlags; +	U64			mRegionFlags;  	U32			mEstateID;  	U32			mParentEstateID; diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 853656905c..9267444534 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -206,12 +206,9 @@ void LLSidepanelAppearance::updateToVisibility(const LLSD &new_visibility)  			}  			// Disable camera switch is currently just for WT_PHYSICS type since we don't want to freeze the avatar  			// when editing its physics. -			const BOOL disable_camera_motion = LLWearableType::getDisableCameraSwitch(wearable_ptr->getType()); -			if (!gAgentCamera.cameraCustomizeAvatar() &&  -				!disable_camera_motion && -				gSavedSettings.getBOOL("AppearanceCameraMovement")) +			if (!gAgentCamera.cameraCustomizeAvatar())  			{ -				gAgentCamera.changeCameraToCustomizeAvatar(); +				LLVOAvatarSelf::onCustomizeStart(LLWearableType::getDisableCameraSwitch(wearable_ptr->getType()));  			}  			if (is_wearable_edit_visible)  			{ @@ -283,7 +280,7 @@ void LLSidepanelAppearance::onEditAppearanceButtonClicked()  {  	if (gAgentWearables.areWearablesLoaded())  	{ -		gAgentCamera.changeCameraToCustomizeAvatar(); +		LLVOAvatarSelf::onCustomizeStart();  	}  } @@ -371,15 +368,14 @@ void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible, BOOL disable_cam  	if (visible)  	{  		mOutfitEdit->onOpen(LLSD()); -		if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") ) -		{ -			gAgentCamera.changeCameraToCustomizeAvatar(); -		} +		LLVOAvatarSelf::onCustomizeStart(disable_camera_switch);  	} -	else if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") ) +	else   	{ -		gAgentCamera.changeCameraToDefault(); -		gAgentCamera.resetView(); +		if (!disable_camera_switch)   // if we're just switching between outfit and wearable editing, don't end customization. +		{ +			LLVOAvatarSelf::onCustomizeEnd(disable_camera_switch); +		}  	}  } @@ -405,10 +401,7 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we  	if (visible)  	{ -		if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") ) -		{ -			gAgentCamera.changeCameraToCustomizeAvatar(); -		} +		LLVOAvatarSelf::onCustomizeStart(disable_camera_switch);  		mEditWearable->setWearable(wearable, disable_camera_switch);  		mEditWearable->onOpen(LLSD()); // currently no-op, just for consistency  	} @@ -416,10 +409,9 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we  	{  		// Save changes if closing.  		mEditWearable->saveChanges(); -		if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") ) +		if (!disable_camera_switch)   // if we're just switching between outfit and wearable editing, don't end customization.  		{ -			gAgentCamera.changeCameraToDefault(); -			gAgentCamera.resetView(); +			LLVOAvatarSelf::onCustomizeEnd(disable_camera_switch);  		}  	}  } diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 42648b82c2..6782e3ef8a 100755 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -3452,6 +3452,14 @@ bool process_login_success_response()  	} +	// set the location of the Agent Appearance service, from which we can request +	// avatar baked textures if they are supported by the current region +	std::string agent_appearance_url = response["agent_appearance_service"]; +	if (!agent_appearance_url.empty()) +	{ +		gSavedSettings.setString("AgentAppearanceServiceURL", agent_appearance_url); +	} +  	// Set the location of the snapshot sharing config endpoint  	std::string snapshot_config_url = response["snapshot_config_url"];  	if(!snapshot_config_url.empty()) diff --git a/indra/newview/lltoolbrush.cpp b/indra/newview/lltoolbrush.cpp index aba43a9715..08d82ea9cb 100644 --- a/indra/newview/lltoolbrush.cpp +++ b/indra/newview/lltoolbrush.cpp @@ -657,7 +657,7 @@ bool LLToolBrushLand::canTerraform(LLViewerRegion* regionp) const  {  	if (!regionp) return false;  	if (regionp->canManageEstate()) return true; -	return !(regionp->getRegionFlags() & REGION_FLAGS_BLOCK_TERRAFORM); +	return !regionp->getRegionFlag(REGION_FLAGS_BLOCK_TERRAFORM);  }  // static diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index c69999981c..3181e19cae 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -1215,7 +1215,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,  	if (!item || !item->isFinished()) return;  	//if (regionp -	//	&& (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX)) +	//	&& (regionp->getRegionFlag(REGION_FLAGS_SANDBOX)))  	//{  	//	LLFirstUse::useSandbox();  	//} diff --git a/indra/newview/lltoolplacer.cpp b/indra/newview/lltoolplacer.cpp index 93ba3b2558..641fbc5042 100644 --- a/indra/newview/lltoolplacer.cpp +++ b/indra/newview/lltoolplacer.cpp @@ -182,7 +182,7 @@ BOOL LLToolPlacer::addObject( LLPCode pcode, S32 x, S32 y, U8 use_physics )  		return FALSE;  	} -	if (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX) +	if (regionp->getRegionFlag(REGION_FLAGS_SANDBOX))  	{  		//LLFirstUse::useSandbox();  	} @@ -485,7 +485,7 @@ BOOL LLToolPlacer::addDuplicate(S32 x, S32 y)  										FALSE);				// select copy  	if (regionp -		&& (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX)) +		&& (regionp->getRegionFlag(REGION_FLAGS_SANDBOX)))  	{  		//LLFirstUse::useSandbox();  	} diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index d58ee05fb6..3b486efd7e 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -1063,7 +1063,7 @@ void render_hud_attachments()  		gPipeline.pushRenderTypeMask();  		// turn off everything -		gPipeline.andRenderTypeMask(LLPipeline::END_RENDER_TYPES); +		gPipeline.clearAllRenderTypes();  		// turn on HUD  		gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_HUD);  		// turn on HUD particles diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 01a54509ef..3c0136c258 100644..100755 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -2798,7 +2798,7 @@ class LLSelfRemoveAllAttachments : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ -		LLAgentWearables::userRemoveAllAttachments(); +		LLAppearanceMgr::instance().removeAllAttachmentsFromAvatar();  		return true;  	}  }; @@ -6389,23 +6389,21 @@ class LLAttachmentDetachFromPoint : public view_listener_t  {  	bool handleEvent(const LLSD& user_data)  	{ +		uuid_vec_t ids_to_remove;  		const LLViewerJointAttachment *attachment = get_if_there(gAgentAvatarp->mAttachmentPoints, user_data.asInteger(), (LLViewerJointAttachment*)NULL);  		if (attachment->getNumObjects() > 0)  		{ -			gMessageSystem->newMessage("ObjectDetach"); -			gMessageSystem->nextBlockFast(_PREHASH_AgentData); -			gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); -			gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -			  			for (LLViewerJointAttachment::attachedobjs_vec_t::const_iterator iter = attachment->mAttachedObjects.begin();  				 iter != attachment->mAttachedObjects.end();  				 iter++)  			{  				LLViewerObject *attached_object = (*iter); -				gMessageSystem->nextBlockFast(_PREHASH_ObjectData); -				gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, attached_object->getLocalID()); +				ids_to_remove.push_back(attached_object->getAttachmentItemID());  			} -			gMessageSystem->sendReliable( gAgent.getRegionHost() ); +		} +		if (!ids_to_remove.empty()) +		{ +			LLAppearanceMgr::instance().removeItemsFromAvatar(ids_to_remove);  		}  		return true;  	} @@ -6478,17 +6476,8 @@ class LLAttachmentDetach : public view_listener_t  			return true;  		} -		// The sendDetach() method works on the list of selected -		// objects.  Thus we need to clear the list, make sure it only -		// contains the object the user clicked, send the message, -		// then clear the list. -		// We use deselectAll to update the simulator's notion of what's -		// selected, and removeAll just to change things locally. -		//RN: I thought it was more useful to detach everything that was selected -		if (LLSelectMgr::getInstance()->getSelection()->isAttachment()) -		{ -			LLSelectMgr::getInstance()->sendDetach(); -		} +		LLAppearanceMgr::instance().removeItemFromAvatar(object->getAttachmentItemID()); +  		return true;  	}  }; @@ -7631,6 +7620,10 @@ void handle_rebake_textures(void*)  	// Slam pending upload count to "unstick" things  	bool slam_for_debug = true;  	gAgentAvatarp->forceBakeAllTextures(slam_for_debug); +	if (gAgent.getRegion() && gAgent.getRegion()->getCentralBakeVersion()) +	{ +		LLAppearanceMgr::instance().requestServerAppearanceUpdate(); +	}  }  void toggle_visibility(void* user_data) @@ -7897,7 +7890,7 @@ class LLEditTakeOff : public view_listener_t  	{  		std::string clothing = userdata.asString();  		if (clothing == "all") -			LLWearableBridge::removeAllClothesFromAvatar(); +			LLAppearanceMgr::instance().removeAllClothesFromAvatar();  		else  		{  			LLWearableType::EType type = LLWearableType::typeNameToType(clothing); @@ -7907,8 +7900,8 @@ class LLEditTakeOff : public view_listener_t  			{  				// MULTI-WEARABLES: assuming user wanted to remove top shirt.  				U32 wearable_index = gAgentWearables.getWearableCount(type) - 1; -				LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(gAgentWearables.getWearableInventoryItem(type,wearable_index)); -				LLWearableBridge::removeItemFromAvatar(item); +				LLUUID item_id = gAgentWearables.getWearableItemID(type,wearable_index); +				LLAppearanceMgr::instance().removeItemFromAvatar(item_id);  			}  		} diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index 3515aa4302..885a0721c0 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -139,6 +139,11 @@ bool handle_go_to();  // Export to XML or Collada  void handle_export_selected( void * ); +// Convert strings to internal types +U32 render_type_from_string(std::string render_type); +U32 feature_from_string(std::string feature); +U32 info_display_from_string(std::string info_display); +  class LLViewerMenuHolderGL : public LLMenuHolderGL  {  public: diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 903f4437a7..f399275c94 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -4900,9 +4900,19 @@ void process_sim_stats(LLMessageSystem *msg, void **user_data)  	// Various hacks that aren't statistics, but are being handled here.  	//  	U32 max_tasks_per_region; -	U32 region_flags; +	U64 region_flags;  	msg->getU32("Region", "ObjectCapacity", max_tasks_per_region); -	msg->getU32("Region", "RegionFlags", region_flags); + +	if (msg->has(_PREHASH_RegionInfo)) +	{ +		msg->getU64("RegionInfo", "RegionFlagsExtended", region_flags); +	} +	else +	{ +		U32 flags = 0; +		msg->getU32("Region", "RegionFlags", flags); +		region_flags = flags; +	}  	LLViewerRegion* regionp = gAgent.getRegion();  	if (regionp) diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index b2e6dc4571..0bf039224c 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -4063,6 +4063,23 @@ void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep)  } +S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, const std::string &url ) +{ +	S32 retval = 0; +	if (uuid != getTE(te)->getID() || +		uuid == LLUUID::null) +	{ +		retval = LLPrimitive::setTETexture(te, uuid); +		mTEImages[te] = LLViewerTextureManager::getFetchedTextureFromUrl  (url, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, uuid); +		setChanged(TEXTURE); +		if (mDrawable.notNull()) +		{ +			gPipeline.markTextured(mDrawable); +		} +	} +	return retval; +} +  S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, LLHost host)  {  	S32 retval = 0; diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 22e0de681e..dd02dce716 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -304,6 +304,7 @@ public:  	/*virtual*/	void	setTE(const U8 te, const LLTextureEntry &texture_entry);  	/*virtual*/ S32		setTETexture(const U8 te, const LLUUID &uuid);  	S32 setTETextureCore(const U8 te, const LLUUID& uuid, LLHost host); +	S32 setTETextureCore(const U8 te, const LLUUID& uuid, const std::string &url );  	/*virtual*/ S32		setTEColor(const U8 te, const LLColor3 &color);  	/*virtual*/ S32		setTEColor(const U8 te, const LLColor4 &color);  	/*virtual*/ S32		setTEScale(const U8 te, const F32 s, const F32 t); diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index e399b45cba..c036fcc114 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -1524,6 +1524,7 @@ static LLFastTimer::DeclareTimer FTM_REGION_SHIFT("Region Shift");  void LLViewerObjectList::shiftObjects(const LLVector3 &offset)  { +	if (gHeadlessClient) return;  	// This is called when we shift our origin when we cross region boundaries...  	// We need to update many object caches, I'll document this more as I dig through the code  	// cleaning things out... diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 77e382b8c7..4cdb568d17 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -696,8 +696,8 @@ bool LLViewerParcelMgr::allowAgentScripts(const LLViewerRegion* region, const LL  	// This mirrors the traditional menu bar parcel icon code, but is not  	// technically correct.  	return region -		&& !(region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) -		&& !(region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) +		&& !region->getRegionFlag(REGION_FLAGS_SKIP_SCRIPTS) +		&& !region->getRegionFlag(REGION_FLAGS_ESTATE_SKIP_SCRIPTS)  		&& parcel  		&& parcel->getAllowOtherScripts();  } @@ -2057,7 +2057,7 @@ void LLViewerParcelMgr::startReleaseLand()  		return;  	}  /* -	if ((region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) +	if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL)  		&& !gAgent.isGodlike())  	{  		LLSD args; @@ -2302,7 +2302,7 @@ void LLViewerParcelMgr::startDeedLandToGroup()  	/*  	if(!gAgent.isGodlike())  	{ -		if((region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) +		if(region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL)  			&& (mCurrentParcel->getOwnerID() != region->getOwner()))  		{  			LLSD args; diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index effa368b7a..fb50b8bb77 100644..100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -279,6 +279,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,  	mZoning(""),  	mIsEstateManager(FALSE),  	mRegionFlags( REGION_FLAGS_DEFAULT ), +	mRegionProtocols( 0 ),  	mSimAccess( SIM_ACCESS_MIN ),  	mBillableFactor(1.0),  	mMaxTasks(DEFAULT_MAX_REGION_WIDE_PRIM_COUNT), @@ -454,18 +455,6 @@ void LLViewerRegion::sendReliableMessage()  	gMessageSystem->sendReliable(mImpl->mHost);  } -void LLViewerRegion::setFlags(BOOL b, U32 flags) -{ -	if (b) -	{ -		mRegionFlags |=  flags; -	} -	else -	{ -		mRegionFlags &= ~flags; -	} -} -  void LLViewerRegion::setWaterHeight(F32 water_level)  {  	mImpl->mLandp->setWaterHeight(water_level); @@ -478,10 +467,10 @@ F32 LLViewerRegion::getWaterHeight() const  BOOL LLViewerRegion::isVoiceEnabled() const  { -	return (getRegionFlags() & REGION_FLAGS_ALLOW_VOICE); +	return getRegionFlag(REGION_FLAGS_ALLOW_VOICE);  } -void LLViewerRegion::setRegionFlags(U32 flags) +void LLViewerRegion::setRegionFlags(U64 flags)  {  	mRegionFlags = flags;  } @@ -574,7 +563,7 @@ std::string LLViewerRegion::getLocalizedSimProductName() const  }  // static -std::string LLViewerRegion::regionFlagsToString(U32 flags) +std::string LLViewerRegion::regionFlagsToString(U64 flags)  {  	std::string result; @@ -1393,7 +1382,8 @@ void LLViewerRegion::unpackRegionHandshake()  {  	LLMessageSystem *msg = gMessageSystem; -	U32 region_flags; +	U64 region_flags = 0; +	U64 region_protocols = 0;  	U8 sim_access;  	std::string sim_name;  	LLUUID sim_owner; @@ -1402,7 +1392,6 @@ void LLViewerRegion::unpackRegionHandshake()  	F32 billable_factor;  	LLUUID cache_id; -	msg->getU32		("RegionInfo", "RegionFlags", region_flags);  	msg->getU8		("RegionInfo", "SimAccess", sim_access);  	msg->getString	("RegionInfo", "SimName", sim_name);  	msg->getUUID	("RegionInfo", "SimOwner", sim_owner); @@ -1411,7 +1400,20 @@ void LLViewerRegion::unpackRegionHandshake()  	msg->getF32		("RegionInfo", "BillableFactor", billable_factor);  	msg->getUUID	("RegionInfo", "CacheID", cache_id ); +	if (msg->has(_PREHASH_RegionInfo4)) +	{ +		msg->getU64Fast(_PREHASH_RegionInfo4, _PREHASH_RegionFlagsExtended, region_flags); +		msg->getU64Fast(_PREHASH_RegionInfo4, _PREHASH_RegionProtocols, region_protocols); +	} +	else +	{ +		U32 flags = 0; +		msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_RegionFlags, flags); +		region_flags = flags; +	} +  	setRegionFlags(region_flags); +	setRegionProtocols(region_protocols);  	setSimAccess(sim_access);  	setRegionNameAndZone(sim_name);  	setOwner(sim_owner); @@ -1450,6 +1452,8 @@ void LLViewerRegion::unpackRegionHandshake()  		mProductName = productName;  	} + +	mCentralBakeVersion = region_protocols & 1; // was (S32)gSavedSettings.getBOOL("UseServerTextureBaking");  	LLVLComposition *compp = getComposition();  	if (compp)  	{ @@ -1577,6 +1581,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)  	capabilityNames.append("UntrustedSimulatorMessage");  	capabilityNames.append("UpdateAgentInformation");  	capabilityNames.append("UpdateAgentLanguage"); +	capabilityNames.append("UpdateAvatarAppearance");  	capabilityNames.append("UpdateGestureAgentInventory");  	capabilityNames.append("UpdateNotecardAgentInventory");  	capabilityNames.append("UpdateScriptAgent"); @@ -1798,7 +1803,7 @@ LLSpatialPartition* LLViewerRegion::getSpatialPartition(U32 type)  // the viewer can not yet distinquish between normal- and estate-owned objects  // so we collapse these two bits and enable the UI if either are set -const U32 ALLOW_RETURN_ENCROACHING_OBJECT = REGION_FLAGS_ALLOW_RETURN_ENCROACHING_OBJECT +const U64 ALLOW_RETURN_ENCROACHING_OBJECT = REGION_FLAGS_ALLOW_RETURN_ENCROACHING_OBJECT  											| REGION_FLAGS_ALLOW_RETURN_ENCROACHING_ESTATE_OBJECT;  bool LLViewerRegion::objectIsReturnable(const LLVector3& pos, const std::vector<LLBBox>& boxes) const @@ -1806,7 +1811,7 @@ bool LLViewerRegion::objectIsReturnable(const LLVector3& pos, const std::vector<  	return (mParcelOverlay != NULL)  		&& (mParcelOverlay->isOwnedSelf(pos)  			|| mParcelOverlay->isOwnedGroup(pos) -			|| ((mRegionFlags & ALLOW_RETURN_ENCROACHING_OBJECT) +			|| (getRegionFlag(ALLOW_RETURN_ENCROACHING_OBJECT)  				&& mParcelOverlay->encroachesOwned(boxes)) );  } diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index c9fffaf30e..20d96ad9ac 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -109,13 +109,13 @@ public:  	//void setAgentOffset(const LLVector3d &offset);  	void updateRenderMatrix(); -	void setAllowDamage(BOOL b) { setFlags(b, REGION_FLAGS_ALLOW_DAMAGE); } -	void setAllowLandmark(BOOL b) { setFlags(b, REGION_FLAGS_ALLOW_LANDMARK); } -	void setAllowSetHome(BOOL b) { setFlags(b, REGION_FLAGS_ALLOW_SET_HOME); } -	void setResetHomeOnTeleport(BOOL b) { setFlags(b, REGION_FLAGS_RESET_HOME_ON_TELEPORT); } -	void setSunFixed(BOOL b) { setFlags(b, REGION_FLAGS_SUN_FIXED); } -	void setBlockFly(BOOL b) { setFlags(b, REGION_FLAGS_BLOCK_FLY); } -	void setAllowDirectTeleport(BOOL b) { setFlags(b, REGION_FLAGS_ALLOW_DIRECT_TELEPORT); } +	void setAllowDamage(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_DAMAGE, b); } +	void setAllowLandmark(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_LANDMARK, b); } +	void setAllowSetHome(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_SET_HOME, b); } +	void setResetHomeOnTeleport(BOOL b) { setRegionFlag(REGION_FLAGS_RESET_HOME_ON_TELEPORT, b); } +	void setSunFixed(BOOL b) { setRegionFlag(REGION_FLAGS_SUN_FIXED, b); } +	void setBlockFly(BOOL b) { setRegionFlag(REGION_FLAGS_BLOCK_FLY, b); } +	void setAllowDirectTeleport(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT, b); }  	inline BOOL getAllowDamage()			const; @@ -156,8 +156,15 @@ public:  	LLViewerParcelOverlay *getParcelOverlay() const  			{ return mParcelOverlay; } -	void setRegionFlags(U32 flags); -	U32 getRegionFlags() const					{ return mRegionFlags; } +	inline void setRegionFlag(U64 flag, BOOL on); +	inline BOOL getRegionFlag(U64 flag) const; +	void setRegionFlags(U64 flags); +	U64 getRegionFlags() const					{ return mRegionFlags; } + +	inline void setRegionProtocol(U64 protocol, BOOL on); +	BOOL getRegionProtocol(U64 protocol) const; +	void setRegionProtocols(U64 protocols)			{ mRegionProtocols = protocols; } +	U64 getRegionProtocols() const					{ return mRegionProtocols; }  	void setTimeDilation(F32 time_dilation);  	F32  getTimeDilation() const				{ return mTimeDilation; } @@ -195,7 +202,7 @@ public:  	std::string getLocalizedSimProductName() const;  	// Returns "Sandbox", "Expensive", etc. -	static std::string regionFlagsToString(U32 flags); +	static std::string regionFlagsToString(U64 flags);  	// Returns translated version of "Mature", "PG", "Adult", etc.  	static std::string accessToString(U8 sim_access); @@ -278,6 +285,8 @@ public:  	F32 getLandHeightRegion(const LLVector3& region_pos); +	U8 getCentralBakeVersion() { return mCentralBakeVersion; } +  	void getInfo(LLSD& info);  	bool meshRezEnabled() const; @@ -345,7 +354,6 @@ public:  protected:  	void disconnectAllNeighbors();  	void initStats(); -	void setFlags(BOOL b, U32 flags);  public:  	LLWind  mWind; @@ -390,11 +398,13 @@ private:  	U32		mPingDelay;  	F32		mDeltaTime;				// Time since last measurement of lastPackets, Bits, etc -	U32		mRegionFlags;			// includes damage flags +	U64		mRegionFlags;			// includes damage flags +	U64		mRegionProtocols;		// protocols supported by this region  	U8		mSimAccess;  	F32 	mBillableFactor;  	U32		mMaxTasks;				// max prim count  	F32		mCameraDistanceSquared;	// updated once per frame +	U8		mCentralBakeVersion;  	// Information for Homestead / CR-53  	S32 mClassID; @@ -423,6 +433,40 @@ private:  	LLSD mSimulatorFeatures;  }; +inline BOOL LLViewerRegion::getRegionProtocol(U64 protocol) const +{ +	return ((mRegionProtocols & protocol) != 0); +} + +inline void LLViewerRegion::setRegionProtocol(U64 protocol, BOOL on) +{ +	if (on) +	{ +		mRegionProtocols |= protocol; +	} +	else +	{ +		mRegionProtocols &= ~protocol; +	} +} + +inline BOOL LLViewerRegion::getRegionFlag(U64 flag) const +{ +	return ((mRegionFlags & flag) != 0); +} + +inline void LLViewerRegion::setRegionFlag(U64 flag, BOOL on) +{ +	if (on) +	{ +		mRegionFlags |= flag; +	} +	else +	{ +		mRegionFlags &= ~flag; +	} +} +  inline BOOL LLViewerRegion::getAllowDamage() const  {  	return ((mRegionFlags & REGION_FLAGS_ALLOW_DAMAGE) !=0); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 1798d554b9..4aabbd6bb6 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1717,6 +1717,7 @@ LLViewerWindow::LLViewerWindow(const Params& p)  void LLViewerWindow::initGLDefaults()  { +	if (gHeadlessClient) return;  	gGL.setSceneBlendType(LLRender::BT_ALPHA);  	if (!LLGLSLShader::sNoFixedFunction) diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 366b6004be..4894f21e67 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -688,12 +688,13 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,  	mFullyLoaded(FALSE),  	mPreviousFullyLoaded(FALSE),  	mFullyLoadedInitialized(FALSE), -	mSupportsAlphaLayers(FALSE),  	mLoadedCallbacksPaused(FALSE),  	mHasPelvisOffset( FALSE ),  	mRenderUnloadedAvatar(LLCachedControl<bool>(gSavedSettings, "RenderUnloadedAvatar")), -	mLastRezzedStatus(-1) - +	mLastRezzedStatus(-1), +	mIsEditingAppearance(FALSE), +	mUseLocalAppearance(FALSE), +	mUseServerBakes(TRUE)  {  	LLMemType mt(LLMemType::MTYPE_AVATAR);  	//VTResume();  // VTune @@ -2381,6 +2382,12 @@ S32 LLVOAvatar::setTETexture(const U8 te, const LLUUID& uuid)  	// to redirect certain avatar texture requests to different sims.  	if (isIndexBakedTexture((ETextureIndex)te))  	{ +		const std::string url = getImageURL(te,uuid); +		if (!url.empty()) +		{ +			return setTETextureCore(te, uuid, url); +		} +  		LLHost target_host = getObjectHost();  		return setTETextureCore(te, uuid, target_host);  	} @@ -4149,7 +4156,7 @@ void LLVOAvatar::updateVisibility()  // private  bool LLVOAvatar::shouldAlphaMask()  { -	const bool should_alpha_mask = mSupportsAlphaLayers && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked +	const bool should_alpha_mask = !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked  							&& !LLDrawPoolAvatar::sSkipTransparent;  	return should_alpha_mask; @@ -4588,6 +4595,7 @@ void LLVOAvatar::updateTextures()  			if (isIndexBakedTexture((ETextureIndex)texture_index)  				&& imagep->getID() != IMG_DEFAULT_AVATAR  				&& imagep->getID() != IMG_INVISIBLE +				&& !mUseServerBakes   				&& !imagep->getTargetHost().isOk())  			{  				LL_WARNS_ONCE("Texture") << "LLVOAvatar::updateTextures No host for texture " @@ -4682,7 +4690,10 @@ void LLVOAvatar::addBakedTextureStats( LLViewerFetchedTexture* imagep, F32 pixel  	//the texture pipeline will stop fetching this texture.  	imagep->resetTextureStats(); -	imagep->setCanUseHTTP(false) ; //turn off http fetching for baked textures. +	// TODO: currently default to HTTP texture and fall back to UDP if cannot be found there. +	// Once server messaging is in place, we should call setCanUseHTTP(false) for old style +	// appearance requests +	imagep->setCanUseHTTP(true);  	imagep->setMaxVirtualSizeResetInterval(MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL);  	imagep->resetMaxVirtualSizeResetCounter() ; @@ -4724,6 +4735,21 @@ void LLVOAvatar::setTexEntry(const U8 index, const LLTextureEntry &te)  	setTE(index, te);  } +const std::string LLVOAvatar::getImageURL(const U8 te, const LLUUID &uuid) +{ +	std::string url = ""; +	if (mUseServerBakes && !gSavedSettings.getString("AgentAppearanceServiceURL").empty()) +	{ +		const LLVOAvatarDictionary::TextureEntry* texture_entry = LLVOAvatarDictionary::getInstance()->getTexture((ETextureIndex)te); +		if (texture_entry != NULL) +		{ +			url = gSavedSettings.getString("AgentAppearanceServiceURL") + "texture/" + getID().asString() + "/" + texture_entry->mDefaultImageName + "/" + uuid.asString(); +			//llinfos << "baked texture url: " << url << llendl; +		} +	} +	return url; +} +  //-----------------------------------------------------------------------------  // resolveHeight()  //----------------------------------------------------------------------------- @@ -6669,7 +6695,6 @@ void LLVOAvatar::updateMeshTextures()  		}  	} -	const BOOL self_customizing = isSelf() && gAgentCamera.cameraCustomizeAvatar(); // During face edit mode, we don't use baked textures  	const BOOL other_culled = !isSelf() && mCulled;  	LLLoadedCallbackEntry::source_callback_list_t* src_callback_list = NULL ;  	BOOL paused = FALSE; @@ -6709,36 +6734,39 @@ void LLVOAvatar::updateMeshTextures()  		{  			use_lkg_baked_layer[i] = (!is_layer_baked[i]   									  && mBakedTextureDatas[i].mLastTextureIndex != IMG_DEFAULT_AVATAR); -			if (mBakedTextureDatas[i].mTexLayerSet) -			{ -				mBakedTextureDatas[i].mTexLayerSet->destroyComposite(); -			}  		}  	} - -	// Turn on alpha masking correctly for yourself and other avatars on 1.23+ -	mSupportsAlphaLayers = isSelf() || is_layer_baked[BAKED_HAIR]; - -	// Baked textures should be requested from the sim this avatar is on. JC -	const LLHost target_host = getObjectHost(); -	if (!target_host.isOk()) -	{ -		llwarns << "updateMeshTextures: invalid host for object: " << getID() << llendl; -	}  	for (U32 i=0; i < mBakedTextureDatas.size(); i++)  	{ -		if (use_lkg_baked_layer[i] && !self_customizing ) +		if (use_lkg_baked_layer[i] && !mUseLocalAppearance )  		{ -			LLViewerFetchedTexture* baked_img = LLViewerTextureManager::getFetchedTextureFromHost( mBakedTextureDatas[i].mLastTextureIndex, target_host ); +			LLViewerFetchedTexture* baked_img; +			const std::string url = getImageURL(i, mBakedTextureDatas[i].mLastTextureIndex); +			if (!url.empty()) +			{ +				baked_img = LLViewerTextureManager::getFetchedTextureFromUrl(url, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, mBakedTextureDatas[i].mLastTextureIndex); +			} +			else +			{ +				// Baked textures should be requested from the sim this avatar is on. JC +				const LLHost target_host = getObjectHost(); +				if (!target_host.isOk()) +				{ +					llwarns << "updateMeshTextures: invalid host for object: " << getID() << llendl; +				} + +				baked_img = LLViewerTextureManager::getFetchedTextureFromHost( mBakedTextureDatas[i].mLastTextureIndex, target_host ); +			} +  			mBakedTextureDatas[i].mIsUsed = TRUE;  			for (U32 k=0; k < mBakedTextureDatas[i].mMeshes.size(); k++)  			{  				mBakedTextureDatas[i].mMeshes[k]->setTexture( baked_img );  			}  		} -		else if (!self_customizing && is_layer_baked[i]) +		else if (!mUseLocalAppearance && is_layer_baked[i])  		{  			LLViewerFetchedTexture* baked_img = LLViewerTextureManager::staticCastToFetchedTexture(getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ;  			if( baked_img->getID() == mBakedTextureDatas[i].mLastTextureIndex ) @@ -6758,8 +6786,7 @@ void LLVOAvatar::updateMeshTextures()  					src_callback_list, paused );  			}  		} -		else if (mBakedTextureDatas[i].mTexLayerSet  -				 && !other_culled)  +		else if (mBakedTextureDatas[i].mTexLayerSet && mUseLocalAppearance)   		{  			mBakedTextureDatas[i].mTexLayerSet->createComposite();  			mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled( TRUE ); @@ -6774,7 +6801,7 @@ void LLVOAvatar::updateMeshTextures()  	// set texture and color of hair manually if we are not using a baked image.  	// This can happen while loading hair for yourself, or for clients that did not  	// bake a hair texture. Still needed for yourself after 1.22 is depricated. -	if (!is_layer_baked[BAKED_HAIR] || self_customizing) +	if (!is_layer_baked[BAKED_HAIR] || mIsEditingAppearance)  	{  		const LLColor4 color = mTexHairColor ? mTexHairColor->getColor() : LLColor4(1,1,1,1);  		LLViewerTexture* hair_img = getImage( TEX_HAIR, 0 ); @@ -7309,7 +7336,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  	if( isSelf() )  	{  		llwarns << avString() << "Received AvatarAppearance for self" << llendl; -		if( mFirstTEMessageReceived ) +		if( mFirstTEMessageReceived && !mUseServerBakes)  		{  //			llinfos << "processAvatarAppearance end  " << mID << llendl;  			return; @@ -7320,9 +7347,44 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  //	llinfos << "LLVOAvatar::processAvatarAppearance()" << llendl;  //	dumpAvatarTEs( "PRE  processAvatarAppearance()" ); -	unpackTEMessage(mesgsys, _PREHASH_ObjectData); +	LLTEContents tec; +	parseTEMessage(mesgsys, _PREHASH_ObjectData, -1, tec);  //	dumpAvatarTEs( "POST processAvatarAppearance()" ); +	U8 appearance_version = 0; +	S32 this_update_cof_version = LLViewerInventoryCategory::VERSION_UNKNOWN; +	S32 last_update_request_cof_version = LLAppearanceMgr::instance().mLastUpdateRequestCOFVersion; +	// For future use: +	//U32 appearance_flags = 0; + +	if (mesgsys->has(_PREHASH_AppearanceData)) +	{ +		mesgsys->getU8Fast(_PREHASH_AppearanceData, _PREHASH_AppearanceVersion, appearance_version, 0); +		mesgsys->getS32Fast(_PREHASH_AppearanceData, _PREHASH_CofVersion, this_update_cof_version, 0); +		// For future use: +		//mesgsys->getU32Fast(_PREHASH_AppearanceData, _PREHASH_Flags, appearance_flags, 0); +	} + +	if (appearance_version > 0) +	{ +		mUseServerBakes = true; +	} +	else +	{ +		mUseServerBakes = false; +	} + +	// Check for stale update. +	if (mUseServerBakes && isSelf() +		&& this_update_cof_version >= LLViewerInventoryCategory::VERSION_INITIAL +		&& this_update_cof_version < last_update_request_cof_version) +	{ +		llwarns << "Stale appearance update, wanted version " << last_update_request_cof_version +				<< ", got " << this_update_cof_version << llendl; +		return; +	} +	applyParsedTEMessage(tec); +  	// prevent the overwriting of valid baked textures with invalid baked textures  	for (U8 baked_index = 0; baked_index < mBakedTextureDatas.size(); baked_index++)  	{ @@ -7345,16 +7407,8 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  	}  	setCompositeUpdatesEnabled( FALSE ); -	mMeshTexturesDirty = TRUE;  	gPipeline.markGLRebuild(this); -	// ! BACKWARDS COMPATIBILITY ! -	// Non-self avatars will no longer have component textures -	if (!isSelf()) -	{ -		releaseComponentTextures(); -	} -	  	// parse visual params  	S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_VisualParam);  	bool drop_visual_params_debug = gSavedSettings.getBOOL("BlockSomeAvatarAppearanceVisualParams") && (ll_rand(2) == 0); // pretend that ~12% of AvatarAppearance messages arrived without a VisualParam block, for testing @@ -7464,6 +7518,13 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  	// If all of the avatars are completely baked, release the global image caches to conserve memory.  	LLVOAvatar::cullAvatarsByPixelArea(); +	if (isSelf()) +	{ +		mUseLocalAppearance = false; +	} + +	updateMeshTextures(); +  //	llinfos << "processAvatarAppearance end " << mID << llendl;  } diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 1adb680962..3f65dec11c 100755 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -227,9 +227,6 @@ public:  private: //aligned members  	LL_ALIGN_16(LLVector4a	mImpostorExtents[2]); -private: -	BOOL			mSupportsAlphaLayers; // For backwards compatibility, TRUE for 1.23+ clients -  	//--------------------------------------------------------------------  	// Updates  	//-------------------------------------------------------------------- @@ -617,6 +614,7 @@ protected:  private:  	virtual	void				setImage(const U8 te, LLViewerTexture *imagep, const U32 index);   	virtual LLViewerTexture*	getImage(const U8 te, const U32 index) const; +	const std::string 			getImageURL(const U8 te, const LLUUID &uuid);  	virtual const LLTextureEntry* getTexEntry(const U8 te_num) const;  	virtual void setTexEntry(const U8 index, const LLTextureEntry &te); @@ -712,10 +710,14 @@ public:  	//--------------------------------------------------------------------  public:  	BOOL			getIsAppearanceAnimating() const { return mAppearanceAnimating; } +	BOOL			isUsingBakedTextures() const { return mUseServerBakes; } // e.g. false if in appearance edit mode		  private:  	BOOL			mAppearanceAnimating;  	LLFrameTimer	mAppearanceMorphTimer;  	F32				mLastAppearanceBlendTime; +	BOOL			mIsEditingAppearance; // flag for if we're actively in appearance editing mode +	BOOL			mUseLocalAppearance; // flag for if we're using a local composite +	BOOL			mUseServerBakes; // flag for if baked textures should be fetched from baking service (false if they're temporary uploads)  	//--------------------------------------------------------------------  	// Clothing colors (convenience functions to access visual parameters) diff --git a/indra/newview/llvoavatardefines.cpp b/indra/newview/llvoavatardefines.cpp index 1ed4e3b61c..ef96a9e923 100644 --- a/indra/newview/llvoavatardefines.cpp +++ b/indra/newview/llvoavatardefines.cpp @@ -66,12 +66,12 @@ LLVOAvatarDictionary::Textures::Textures()  	addEntry(TEX_UPPER_TATTOO,                new TextureEntry("upper_tattoo",     TRUE,  BAKED_NUM_INDICES, "",     LLWearableType::WT_TATTOO));  	addEntry(TEX_LOWER_TATTOO,                new TextureEntry("lower_tattoo",     TRUE,  BAKED_NUM_INDICES, "",     LLWearableType::WT_TATTOO)); -	addEntry(TEX_HEAD_BAKED,                  new TextureEntry("head-baked",       FALSE, BAKED_HEAD)); -	addEntry(TEX_UPPER_BAKED,                 new TextureEntry("upper-baked",      FALSE, BAKED_UPPER)); -	addEntry(TEX_LOWER_BAKED,                 new TextureEntry("lower-baked",      FALSE, BAKED_LOWER)); -	addEntry(TEX_EYES_BAKED,                  new TextureEntry("eyes-baked",       FALSE, BAKED_EYES)); -	addEntry(TEX_HAIR_BAKED,                  new TextureEntry("hair-baked",       FALSE, BAKED_HAIR)); -	addEntry(TEX_SKIRT_BAKED,                 new TextureEntry("skirt-baked",      FALSE, BAKED_SKIRT)); +	addEntry(TEX_HEAD_BAKED,                  new TextureEntry("head-baked",       FALSE, BAKED_HEAD, "head")); +	addEntry(TEX_UPPER_BAKED,                 new TextureEntry("upper-baked",      FALSE, BAKED_UPPER, "upper")); +	addEntry(TEX_LOWER_BAKED,                 new TextureEntry("lower-baked",      FALSE, BAKED_LOWER, "lower")); +	addEntry(TEX_EYES_BAKED,                  new TextureEntry("eyes-baked",       FALSE, BAKED_EYES, "eyes")); +	addEntry(TEX_HAIR_BAKED,                  new TextureEntry("hair-baked",       FALSE, BAKED_HAIR, "hair")); +	addEntry(TEX_SKIRT_BAKED,                 new TextureEntry("skirt-baked",      FALSE, BAKED_SKIRT, "skirt"));  }  LLVOAvatarDictionary::BakedTextures::BakedTextures() diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 7a81063f83..6c8cbc37f7 100755 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -812,7 +812,7 @@ U32  LLVOAvatarSelf::processUpdateMessage(LLMessageSystem *mesgsys,  		updateMeshTextures();  		// unpack the texture UUIDs to the texture slots -		retval = unpackTEMessage(mesgsys, _PREHASH_ObjectData, block_num); +		retval = unpackTEMessage(mesgsys, _PREHASH_ObjectData, (S32) block_num);  		// need to trigger a few operations to get the avatar to use the new bakes  		for (U32 i = 0; i < mBakedTextureDatas.size(); i++) @@ -885,7 +885,10 @@ void LLVOAvatarSelf::removeMissingBakedTextures()  			invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, FALSE);  		}  		updateMeshTextures(); -		requestLayerSetUploads(); +		if (getRegion() && !getRegion()->getCentralBakeVersion()) +		{ +			requestLayerSetUploads(); +		}  	}  } @@ -1293,7 +1296,7 @@ BOOL LLVOAvatarSelf::detachAttachmentIntoInventory(const LLUUID &item_id)  			const LLViewerObject *attached_obj = gAgentAvatarp->getWornAttachment(item_id);  			if (!attached_obj)  			{ -				LLAppearanceMgr::instance().removeCOFItemLinks(item_id, false); +				LLAppearanceMgr::instance().removeCOFItemLinks(item_id);  			}  		}  		return TRUE; @@ -1628,7 +1631,7 @@ void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_r  	layerset->requestUpdate();  	layerset->invalidateMorphMasks(); -	if( upload_result ) +	if( upload_result  && (getRegion() && !getRegion()->getCentralBakeVersion()))  	{  		llassert(isSelf()); @@ -2611,15 +2614,6 @@ void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**)  	}  } -BOOL LLVOAvatarSelf::isUsingBakedTextures() const -{ -	// Composite textures are used during appearance mode. -	if (gAgentCamera.cameraCustomizeAvatar()) -		return FALSE; - -	return TRUE; -} -  void LLVOAvatarSelf::forceBakeAllTextures(bool slam_for_debug)  { @@ -2700,19 +2694,44 @@ LLTexLayerSet* LLVOAvatarSelf::getLayerSet(EBakedTextureIndex baked_index) const  // static -void LLVOAvatarSelf::onCustomizeStart() +void LLVOAvatarSelf::onCustomizeStart(bool disable_camera_switch)  { -	// We're no longer doing any baking or invalidating on entering  -	// appearance editing mode. Leaving function in place in case  -	// further changes require us to do something at this point - Nyx +	if (isAgentAvatarValid()) +	{ +		gAgentAvatarp->mIsEditingAppearance = true; +		gAgentAvatarp->mUseLocalAppearance = true; + +		if (gSavedSettings.getBOOL("AppearanceCameraMovement") && !disable_camera_switch) +		{ +			gAgentCamera.changeCameraToCustomizeAvatar(); +		} + +		gAgentAvatarp->invalidateAll(); +		gAgentAvatarp->updateMeshTextures(); +	}  }  // static -void LLVOAvatarSelf::onCustomizeEnd() +void LLVOAvatarSelf::onCustomizeEnd(bool disable_camera_switch)  { +  	if (isAgentAvatarValid())  	{ +		gAgentAvatarp->mIsEditingAppearance = false; +		if (gAgentAvatarp->getRegion() && !gAgentAvatarp->getRegion()->getCentralBakeVersion()) +		{ +			gAgentAvatarp->mUseLocalAppearance = false; +		} +  		gAgentAvatarp->invalidateAll(); + +		if (gSavedSettings.getBOOL("AppearanceCameraMovement") && !disable_camera_switch) +		{ +			gAgentCamera.changeCameraToDefault(); +			gAgentCamera.resetView(); +		} + +		LLAppearanceMgr::instance().updateAppearanceFromCOF();  	}  } diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 7bd0c0bf93..92d59dc9e1 100755 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -239,7 +239,6 @@ public:  	void				setCachedBakedTexture(LLVOAvatarDefines::ETextureIndex i, const LLUUID& uuid);  	void				forceBakeAllTextures(bool slam_for_debug = false);  	static void			processRebakeAvatarTextures(LLMessageSystem* msg, void**); -	BOOL				isUsingBakedTextures() const; // e.g. false if in appearance edit mode  protected:  	/*virtual*/ void	removeMissingBakedTextures(); @@ -340,8 +339,8 @@ private:   **/  public: -	static void		onCustomizeStart(); -	static void		onCustomizeEnd(); +	static void		onCustomizeStart(bool disable_camera_switch = false); +	static void		onCustomizeEnd(bool disable_camera_switch = false);  	//--------------------------------------------------------------------  	// Visibility diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 9c36cfee59..b43bdb69f8 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -370,7 +370,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,  		// Unpack texture entry data  		// -		S32 result = unpackTEMessage(mesgsys, _PREHASH_ObjectData, block_num); +		S32 result = unpackTEMessage(mesgsys, _PREHASH_ObjectData, (S32) block_num);  		if (result & teDirtyBits)  		{  			updateTEData(); diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index 92697fb2eb..c7e9215643 100644..100755 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -788,23 +788,24 @@ LLContextMenu* LLWearableItemsList::ContextMenu::createMenu()  	const uuid_vec_t& ids = mUUIDs;		// selected items IDs  	LLUUID selected_id = ids.front();	// ID of the first selected item -	functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1); -  	// Register handlers common for all wearable types.  	registrar.add("Wearable.Wear", boost::bind(wear_multiple, ids, true));  	registrar.add("Wearable.Add", boost::bind(wear_multiple, ids, false));  	registrar.add("Wearable.Edit", boost::bind(handleMultiple, LLAgentWearables::editWearable, ids));  	registrar.add("Wearable.CreateNew", boost::bind(createNewWearable, selected_id));  	registrar.add("Wearable.ShowOriginal", boost::bind(show_item_original, selected_id)); -	registrar.add("Wearable.TakeOffDetach", boost::bind(handleMultiple, take_off, ids)); +	registrar.add("Wearable.TakeOffDetach",  +				  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids));  	// Register handlers for clothing. -	registrar.add("Clothing.TakeOff", boost::bind(handleMultiple, take_off, ids)); +	registrar.add("Clothing.TakeOff",  +				  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids));  	// Register handlers for body parts.  	// Register handlers for attachments. -	registrar.add("Attachment.Detach", boost::bind(handleMultiple, take_off, ids)); +	registrar.add("Attachment.Detach",  +				  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), ids));  	registrar.add("Attachment.Profile", boost::bind(show_item_profile, selected_id));  	registrar.add("Object.Attach", boost::bind(LLViewerAttachMenu::attachObjects, ids, _2)); diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index 350ba39b45..cb24e96d5b 100644 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -389,7 +389,7 @@ void LLWorldMap::reloadItems(bool force)  // static public  // Insert a region in the region map  // returns true if region inserted, false otherwise -bool LLWorldMap::insertRegion(U32 x_world, U32 y_world, std::string& name, LLUUID& image_id, U32 accesscode, U32 region_flags) +bool LLWorldMap::insertRegion(U32 x_world, U32 y_world, std::string& name, LLUUID& image_id, U32 accesscode, U64 region_flags)  {  	// This region doesn't exist  	if (accesscode == 255) diff --git a/indra/newview/llworldmap.h b/indra/newview/llworldmap.h index 73530b9694..c17feaa04b 100644 --- a/indra/newview/llworldmap.h +++ b/indra/newview/llworldmap.h @@ -102,7 +102,7 @@ public:  	// Setters  	void setName(std::string& name) { mName = name; }  	void setAccess (U32 accesscode) { mAccess = accesscode; } -	void setRegionFlags (U32 region_flags) { mRegionFlags = region_flags; } +	void setRegionFlags (U64 region_flags) { mRegionFlags = region_flags; }  	void setLandForSaleImage (LLUUID image_id);  //	void setWaterHeight (F32 water_height) { mWaterHeight = water_height; } @@ -152,7 +152,7 @@ private:  	bool mFirstAgentRequest;	// Init agent request flag  	U32  mAccess;				// Down/up and maturity rating of the region -	U32 mRegionFlags;			// Tell us if the siminfo has been received (if non 0) and what kind of region it is (Sandbox, allow damage) +	U64 mRegionFlags;			// Tell us if the siminfo has been received (if non 0) and what kind of region it is (Sandbox, allow damage)  	// Currently not used but might prove useful one day so we comment out   //	F32 mWaterHeight;			// Water height on the region (not actively used) @@ -198,7 +198,7 @@ public:  	// Insert a region and items in the map global instance  	// Note: x_world and y_world in world coordinates (meters) -	static bool insertRegion(U32 x_world, U32 y_world, std::string& name, LLUUID& uuid, U32 accesscode, U32 region_flags); +	static bool insertRegion(U32 x_world, U32 y_world, std::string& name, LLUUID& uuid, U32 accesscode, U64 region_flags);  	static bool insertItem(U32 x_world, U32 y_world, std::string& name, LLUUID& uuid, U32 type, S32 extra, S32 extra2);  	// Get info on sims (region) : note that those methods only search the range of loaded sims (the one that are being browsed) diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 920bac93a2..e874373f9e 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -72,6 +72,7 @@  #include "llhudtext.h"  #include "lllightconstants.h"  #include "llmeshrepository.h" +#include "llpipelinelistener.h"  #include "llresmgr.h"  #include "llselectmgr.h"  #include "llsky.h" @@ -378,6 +379,8 @@ BOOL    LLPipeline::sMemAllocationThrottled = FALSE;  S32		LLPipeline::sVisibleLightCount = 0;  F32		LLPipeline::sMinRenderSize = 0.f; +// EventHost API LLPipeline listener. +static LLPipelineListener sPipelineListener;  static LLCullResult* sCull = NULL; @@ -494,19 +497,29 @@ void LLPipeline::init()  	LLViewerStats::getInstance()->mTrianglesDrawnStat.reset();  	resetFrameStats(); -	for (U32 i = 0; i < NUM_RENDER_TYPES; ++i) +	if (gSavedSettings.getBOOL("DisableAllRenderFeatures"))  	{ -		mRenderTypeEnabled[i] = TRUE; //all rendering types start enabled +		clearAllRenderDebugFeatures();  	} +	else +	{ +		setAllRenderDebugFeatures(); // By default, all debugging features on +	} +	clearAllRenderDebugDisplays(); // All debug displays off -	mRenderDebugFeatureMask = 0xffffffff; // All debugging features on -	mRenderDebugMask = 0;	// All debug starts off - -	// Don't turn on ground when this is set -	// Mac Books with intel 950s need this -	if(!gSavedSettings.getBOOL("RenderGround")) +	if (gSavedSettings.getBOOL("DisableAllRenderTypes")) +	{ +		clearAllRenderTypes(); +	} +	else  	{ -		toggleRenderType(RENDER_TYPE_GROUND); +		setAllRenderTypes(); // By default, all rendering types start enabled +		// Don't turn on ground when this is set +		// Mac Books with intel 950s need this +		if(!gSavedSettings.getBOOL("RenderGround")) +		{ +			toggleRenderType(RENDER_TYPE_GROUND); +		}  	}  	// make sure RenderPerformanceTest persists (hackity hack hack) @@ -1126,6 +1139,7 @@ void LLPipeline::releaseScreenBuffers()  void LLPipeline::createGLBuffers()  { +	if (gHeadlessClient) return;  	stop_glerror();  	LLMemType mt_cb(LLMemType::MTYPE_PIPELINE_CREATE_BUFFERS);  	assertInitialized(); @@ -6427,6 +6441,22 @@ void LLPipeline::setRenderDebugFeatureControl(U32 bit, bool value)  	}  } +void LLPipeline::pushRenderDebugFeatureMask() +{ +	mRenderDebugFeatureStack.push(mRenderDebugFeatureMask); +} + +void LLPipeline::popRenderDebugFeatureMask() +{ +	if (mRenderDebugFeatureStack.empty()) +	{ +		llerrs << "Depleted render feature stack." << llendl; +	} + +	mRenderDebugFeatureMask = mRenderDebugFeatureStack.top(); +	mRenderDebugFeatureStack.pop(); +} +  // static  void LLPipeline::setRenderScriptedBeacons(BOOL val)  { @@ -10402,6 +10432,22 @@ void LLPipeline::clearRenderTypeMask(U32 type, ...)  	}  } +void LLPipeline::setAllRenderTypes() +{ +	for (U32 i = 0; i < NUM_RENDER_TYPES; ++i) +	{ +		mRenderTypeEnabled[i] = TRUE; +	} +} + +void LLPipeline::clearAllRenderTypes() +{ +	for (U32 i = 0; i < NUM_RENDER_TYPES; ++i) +	{ +		mRenderTypeEnabled[i] = FALSE; +	} +} +  void LLPipeline::addDebugBlip(const LLVector3& position, const LLColor4& color)  {  	DebugBlip blip(position, color); diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index fd2a1e06cd..fe36c7cf4f 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -307,20 +307,28 @@ public:  	BOOL hasRenderDebugFeatureMask(const U32 mask) const	{ return (mRenderDebugFeatureMask & mask) ? TRUE : FALSE; }  	BOOL hasRenderDebugMask(const U32 mask) const			{ return (mRenderDebugMask & mask) ? TRUE : FALSE; } -	 - +	void setAllRenderDebugFeatures() { mRenderDebugFeatureMask = 0xffffffff; } +	void clearAllRenderDebugFeatures() { mRenderDebugFeatureMask = 0x0; } +	void setAllRenderDebugDisplays() { mRenderDebugMask = 0xffffffff; } +	void clearAllRenderDebugDisplays() { mRenderDebugMask = 0x0; }  	BOOL hasRenderType(const U32 type) const;  	BOOL hasAnyRenderType(const U32 type, ...) const;  	void setRenderTypeMask(U32 type, ...); -	void orRenderTypeMask(U32 type, ...); +	// This is equivalent to 'setRenderTypeMask' +	//void orRenderTypeMask(U32 type, ...);  	void andRenderTypeMask(U32 type, ...);  	void clearRenderTypeMask(U32 type, ...); +	void setAllRenderTypes(); +	void clearAllRenderTypes();  	void pushRenderTypeMask();  	void popRenderTypeMask(); +	void pushRenderDebugFeatureMask(); +	void popRenderDebugFeatureMask(); +  	static void toggleRenderType(U32 type);  	// For UI control of render features @@ -617,6 +625,7 @@ protected:  	U32						mRenderDebugFeatureMask;  	U32						mRenderDebugMask; +	std::stack<U32>			mRenderDebugFeatureStack;  	U32						mOldRenderDebugMask; | 
