diff options
Diffstat (limited to 'indra')
23 files changed, 365 insertions, 159 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/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/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index ae95d7d9b7..6914c39075 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> @@ -12351,6 +12362,17 @@        <key>Value</key>        <integer>1</integer>      </map> +    <key>UseServerTextureBaking</key> +    <map> +      <key>Comment</key> +      <string>Update appearance via the ServerTextureBaking cap, if available</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>    <key>RenderSynchronousOcclusion</key>    <map>      <key>Comment</key> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 447836910d..698f89ef26 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() || LLAppearanceMgr::instance().useServerTextureBaking()) 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..0a721312f3 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() || LLAppearanceMgr::instance().useServerTextureBaking())  	{  		return;  	} diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 6d67e098a6..0c7f89203e 100755 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -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()  { @@ -1731,6 +1743,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 (useServerTextureBaking()) +	{ +		requestServerAppearanceUpdate(); +	} +	  	//dumpCat(getCOF(),"COF, start");  	bool follow_folder_links = true; @@ -2582,8 +2600,43 @@ void LLAppearanceMgr::updateClothingOrderingInfo(LLUUID cat_id, bool update_base  	if (inventory_changed) gInventory.notifyObservers();  } +// Should be true iff both the appropriate debug setting is enabled +// and the corresponding cap has been found. +bool LLAppearanceMgr::useServerTextureBaking() +{ +	// TODO: add cap check. +	return gSavedSettings.getBOOL("UseServerTextureBaking"); +} +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" << llendl; +	} +	 +	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  { @@ -2795,7 +2848,8 @@ LLAppearanceMgr::LLAppearanceMgr():  	mAttachmentInvLinkEnabled(false),  	mOutfitIsDirty(false),  	mOutfitLocked(false), -	mIsInUpdateAppearanceFromCOF(false) +	mIsInUpdateAppearanceFromCOF(false), +	mLastUpdateRequestCOFVersion(LLViewerInventoryCategory::VERSION_UNKNOWN)  {  	LLOutfitObserver& outfit_observer = LLOutfitObserver::instance(); diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index c1d561781d..45291419c7 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(); @@ -182,6 +185,10 @@ public:  	bool isInUpdateAppearanceFromCOF() { return mIsInUpdateAppearanceFromCOF; } +	bool useServerTextureBaking(); + +	void requestServerAppearanceUpdate(); +  protected:  	LLAppearanceMgr();  	~LLAppearanceMgr(); diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp index bf8338e5f2..bf8338e5f2 100644..100755 --- a/indra/newview/lldynamictexture.cpp +++ b/indra/newview/lldynamictexture.cpp 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/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 cef6ca3edc..b56f2d8f0a 100755 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -3425,6 +3425,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/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 31e4fd1ed5..cac7b8bc2d 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -4156,6 +4156,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 f8f6327750..b8a7a1145a 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -315,6 +315,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/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 05c7ef5381..fabfde0526 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1578,6 +1578,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"); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 34484ffa6c..b7bb4e6b47 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -192,6 +192,8 @@ const S32 MAX_BUBBLE_CHAT_UTTERANCES = 12;  const F32 CHAT_FADE_TIME = 8.0;  const F32 BUBBLE_CHAT_TIME = CHAT_FADE_TIME * 3.f; +const S32 SERVER_GENERATED_APPEARANCE = 359949045; +  const LLColor4 DUMMY_COLOR = LLColor4(0.5,0.5,0.5,1.0);  enum ERenderName @@ -688,12 +690,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 +2384,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);  	} @@ -4151,7 +4160,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; @@ -4590,6 +4599,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 " @@ -4684,7 +4694,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() ; @@ -4726,6 +4739,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 (LLAppearanceMgr::instance().useServerTextureBaking() && !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()  //----------------------------------------------------------------------------- @@ -6671,7 +6699,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; @@ -6711,36 +6738,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 ) @@ -6760,8 +6790,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 ); @@ -6776,7 +6805,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 ); @@ -7311,7 +7340,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  	if( isSelf() )  	{  		llwarns << avString() << "Received AvatarAppearance for self" << llendl; -		if( mFirstTEMessageReceived ) +		if( mFirstTEMessageReceived && !LLAppearanceMgr::instance().useServerTextureBaking())  		{  //			llinfos << "processAvatarAppearance end  " << mID << llendl;  			return; @@ -7322,9 +7351,40 @@ 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()" ); +	// Extract COF Version field hacked into local texture id. +	LLUUID flags_id = ((LLUUID*)tec.image_data)[0]; +	S32 this_update_cof_version = (flags_id.mData[0] << 24) + (flags_id.mData[1] << 16) +(flags_id.mData[2] << 8) +flags_id.mData[3]; +	S32 message_type = (flags_id.mData[4] << 24) + (flags_id.mData[5] << 16) +(flags_id.mData[6] << 8) +flags_id.mData[7]; + +	if (message_type == SERVER_GENERATED_APPEARANCE) +	{ +		mUseServerBakes = true; +	} +	else +	{ +		mUseServerBakes = false; +	} + +	S32 last_update_request_cof_version = LLAppearanceMgr::instance().mLastUpdateRequestCOFVersion; + +	// Check for stale update. +	if (isSelf() && mUseServerBakes) +	{ +		if ((this_update_cof_version > 0) &&  +			(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; +		} +		((LLUUID*)tec.image_data)[0].setNull(); +	} +	applyParsedTEMessage(tec); +  	// prevent the overwriting of valid baked textures with invalid baked textures  	for (U8 baked_index = 0; baked_index < mBakedTextureDatas.size(); baked_index++)  	{ @@ -7347,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 @@ -7466,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 f5692bb52f..78a1e31c1f 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); @@ -716,6 +714,9 @@ private:  	BOOL			mAppearanceAnimating;  	LLFrameTimer	mAppearanceMorphTimer;  	F32				mLastAppearanceBlendTime; +	BOOL			mIsEditingAppearance; +	BOOL			mUseLocalAppearance; +	BOOL			mUseServerBakes;  	//--------------------------------------------------------------------  	// 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 76131727c4..ff30813cb6 100755 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -814,7 +814,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++) @@ -887,7 +887,10 @@ void LLVOAvatarSelf::removeMissingBakedTextures()  			invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, FALSE);  		}  		updateMeshTextures(); -		requestLayerSetUploads(); +		if (!LLAppearanceMgr::instance().useServerTextureBaking()) +		{ +			requestLayerSetUploads(); +		}  	}  } @@ -1630,7 +1633,7 @@ void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_r  	layerset->requestUpdate();  	layerset->invalidateMorphMasks(); -	if( upload_result ) +	if( upload_result  && !LLAppearanceMgr::instance().useServerTextureBaking())  	{  		llassert(isSelf()); @@ -2702,19 +2705,43 @@ 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)  { +	gAgentAvatarp->mIsEditingAppearance = false; +	if (!LLAppearanceMgr::instance().useServerTextureBaking()) +	{ +		gAgentAvatarp->mUseLocalAppearance = false; +	} +  	if (isAgentAvatarValid())  	{  		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 2b273e616c..41dee1804f 100755 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -340,8 +340,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 0e02b972fb..a54c2a59df 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();  | 
