diff options
| author | Vadim Savchuk <vsavchuk@productengine.com> | 2010-06-16 15:25:40 +0300 | 
|---|---|---|
| committer | Vadim Savchuk <vsavchuk@productengine.com> | 2010-06-16 15:25:40 +0300 | 
| commit | 9cb1fcec6d52933f01426aec4e6a3f1b6774632c (patch) | |
| tree | ac6b0a5ddb280db610162dece01166905d46b60e /indra | |
| parent | b9a468aff6b4b9bdaf4ac0ab2a309902c6c203ed (diff) | |
| parent | 9ee5a62332353db6a098628e69732d2723cc5deb (diff) | |
Merge from default branch
--HG--
branch : product-engine
Diffstat (limited to 'indra')
45 files changed, 1363 insertions, 964 deletions
| diff --git a/indra/llcharacter/llkeyframewalkmotion.cpp b/indra/llcharacter/llkeyframewalkmotion.cpp index f814618fc1..0587e5642c 100644 --- a/indra/llcharacter/llkeyframewalkmotion.cpp +++ b/indra/llcharacter/llkeyframewalkmotion.cpp @@ -44,32 +44,31 @@  //-----------------------------------------------------------------------------  // Macros  //----------------------------------------------------------------------------- -const F32 MAX_WALK_PLAYBACK_SPEED = 8.f;	// max m/s for which we adjust walk cycle speed - -const F32 MIN_WALK_SPEED = 0.1f;	// minimum speed at which we use velocity for down foot detection -const F32 MAX_TIME_DELTA = 2.f;		//max two seconds a frame for calculating interpolation -F32 SPEED_ADJUST_MAX = 2.5f; // maximum adjustment of walk animation playback speed -F32 SPEED_ADJUST_MAX_SEC = 3.f;	// maximum adjustment to walk animation playback speed for a second -F32 ANIM_SPEED_MAX = 10.0f; // absolute upper limit on animation speed -F32 ANIM_SPEED_MIN = 0.0f; // absolute lower limit on animation speed -const F32 DRIFT_COMP_MAX_TOTAL = 0.07f;//0.55f; // maximum drift compensation overall, in any direction  -const F32 DRIFT_COMP_MAX_SPEED = 4.f; // speed at which drift compensation total maxes out +const F32 MAX_WALK_PLAYBACK_SPEED = 8.f;		// max m/s for which we adjust walk cycle speed + +const F32 MIN_WALK_SPEED = 0.1f;				// minimum speed at which we use velocity for down foot detection +const F32 TIME_EPSILON = 0.001f;				// minumum frame time +const F32 MAX_TIME_DELTA = 2.f;					// max two seconds a frame for calculating interpolation +F32 SPEED_ADJUST_MAX_SEC = 2.f;					// maximum adjustment to walk animation playback speed for a second +F32 ANIM_SPEED_MAX = 1.5f;						// absolute upper limit on animation speed +const F32 DRIFT_COMP_MAX_TOTAL = 0.1f;			// maximum drift compensation overall, in any direction  +const F32 DRIFT_COMP_MAX_SPEED = 4.f;			// speed at which drift compensation total maxes out  const F32 MAX_ROLL = 0.6f; +const F32 PELVIS_COMPENSATION_WIEGHT = 0.7f; 	// proportion of foot drift that is compensated by moving the avatar directly +const F32 SPEED_ADJUST_TIME_CONSTANT = 0.1f; 	// time constant for speed adjustment interpolation  //-----------------------------------------------------------------------------  // LLKeyframeWalkMotion()  // Class Constructor  //-----------------------------------------------------------------------------  LLKeyframeWalkMotion::LLKeyframeWalkMotion(const LLUUID &id) -  : LLKeyframeMotion(id), -     +:	LLKeyframeMotion(id),      mCharacter(NULL),      mCyclePhase(0.0f),      mRealTimeLast(0.0f),      mAdjTimeLast(0.0f),      mDownFoot(0) -{ -} +{}  //----------------------------------------------------------------------------- @@ -77,8 +76,7 @@ LLKeyframeWalkMotion::LLKeyframeWalkMotion(const LLUUID &id)  // Class Destructor  //-----------------------------------------------------------------------------  LLKeyframeWalkMotion::~LLKeyframeWalkMotion() -{ -} +{}  //----------------------------------------------------------------------------- @@ -149,15 +147,12 @@ BOOL LLKeyframeWalkMotion::onUpdate(F32 time, U8* joint_mask)  LLWalkAdjustMotion::LLWalkAdjustMotion(const LLUUID &id) :  	LLMotion(id),  	mLastTime(0.f), -	mAvgCorrection(0.f), -	mSpeedAdjust(0.f),  	mAnimSpeed(0.f), -	mAvgSpeed(0.f), +	mAdjustedSpeed(0.f),  	mRelativeDir(0.f),  	mAnkleOffset(0.f)  {  	mName = "walk_adjust"; -  	mPelvisState = new LLJointState;  } @@ -189,15 +184,16 @@ LLMotion::LLMotionInitStatus LLWalkAdjustMotion::onInitialize(LLCharacter *chara  //-----------------------------------------------------------------------------  BOOL LLWalkAdjustMotion::onActivate()  { -	mAvgCorrection = 0.f; -	mSpeedAdjust = 0.f;  	mAnimSpeed = 0.f; -	mAvgSpeed = 0.f; +	mAdjustedSpeed = 0.f;  	mRelativeDir = 1.f;  	mPelvisState->setPosition(LLVector3::zero);  	// store ankle positions for next frame -	mLastLeftAnklePos = mCharacter->getPosGlobalFromAgent(mLeftAnkleJoint->getWorldPosition()); -	mLastRightAnklePos = mCharacter->getPosGlobalFromAgent(mRightAnkleJoint->getWorldPosition()); +	mLastLeftFootGlobalPos = mCharacter->getPosGlobalFromAgent(mLeftAnkleJoint->getWorldPosition()); +	mLastLeftFootGlobalPos.mdV[VZ] = 0.0; + +	mLastRightFootGlobalPos = mCharacter->getPosGlobalFromAgent(mRightAnkleJoint->getWorldPosition()); +	mLastRightFootGlobalPos.mdV[VZ] = 0.0;  	F32 leftAnkleOffset = (mLeftAnkleJoint->getWorldPosition() - mCharacter->getCharacterPosition()).magVec();  	F32 rightAnkleOffset = (mRightAnkleJoint->getWorldPosition() - mCharacter->getCharacterPosition()).magVec(); @@ -211,164 +207,120 @@ BOOL LLWalkAdjustMotion::onActivate()  //-----------------------------------------------------------------------------  BOOL LLWalkAdjustMotion::onUpdate(F32 time, U8* joint_mask)  { -	LLVector3 footCorrection; -	LLVector3 vel = mCharacter->getCharacterVelocity() * mCharacter->getTimeDilation(); -	F32 deltaTime = llclamp(time - mLastTime, 0.f, MAX_TIME_DELTA); +	// delta_time is guaranteed to be non zero +	F32 delta_time = llclamp(time - mLastTime, TIME_EPSILON, MAX_TIME_DELTA);  	mLastTime = time; -	LLQuaternion inv_rotation = ~mPelvisJoint->getWorldRotation(); +	// find the avatar motion vector in the XY plane +	LLVector3 avatar_velocity = mCharacter->getCharacterVelocity() * mCharacter->getTimeDilation(); +	avatar_velocity.mV[VZ] = 0.f; -	// get speed and normalize velocity vector -	LLVector3 ang_vel = mCharacter->getCharacterAngularVelocity() * mCharacter->getTimeDilation(); -	F32 speed = llmin(vel.normVec(), MAX_WALK_PLAYBACK_SPEED); -	mAvgSpeed = lerp(mAvgSpeed, speed, LLCriticalDamp::getInterpolant(0.2f)); +	F32 speed = llclamp(avatar_velocity.magVec(), 0.f, MAX_WALK_PLAYBACK_SPEED); -	// calculate facing vector in pelvis-local space  -	// (either straight forward or back, depending on velocity) -	LLVector3 localVel = vel * inv_rotation; -	if (localVel.mV[VX] > 0.f) -	{ -		mRelativeDir = 1.f; -	} -	else if (localVel.mV[VX] < 0.f) -	{ -		mRelativeDir = -1.f; -	} +	// grab avatar->world transforms +	LLQuaternion avatar_to_world_rot = mCharacter->getRootJoint()->getWorldRotation(); -	// calculate world-space foot drift -	LLVector3 leftFootDelta; -	LLVector3 leftFootWorldPosition = mLeftAnkleJoint->getWorldPosition(); -	LLVector3d leftFootGlobalPosition = mCharacter->getPosGlobalFromAgent(leftFootWorldPosition); -	leftFootDelta.setVec(mLastLeftAnklePos - leftFootGlobalPosition); -	mLastLeftAnklePos = leftFootGlobalPosition; +	LLQuaternion world_to_avatar_rot(avatar_to_world_rot); +	world_to_avatar_rot.conjugate(); -	LLVector3 rightFootDelta; -	LLVector3 rightFootWorldPosition = mRightAnkleJoint->getWorldPosition(); -	LLVector3d rightFootGlobalPosition = mCharacter->getPosGlobalFromAgent(rightFootWorldPosition); -	rightFootDelta.setVec(mLastRightAnklePos - rightFootGlobalPosition); -	mLastRightAnklePos = rightFootGlobalPosition; +	LLVector3 foot_slip_vector;  	// find foot drift along velocity vector -	if (mAvgSpeed > 0.1) -	{ -		// walking/running -		F32 leftFootDriftAmt = leftFootDelta * vel; -		F32 rightFootDriftAmt = rightFootDelta * vel; - -		if (rightFootDriftAmt > leftFootDriftAmt) -		{ -			footCorrection = rightFootDelta; -		} else -		{ -			footCorrection = leftFootDelta; -		} -	} -	else -	{ -		mAvgSpeed = ang_vel.magVec() * mAnkleOffset; -		mRelativeDir = 1.f; - -		// standing/turning -		// find the lower foot -		if (leftFootWorldPosition.mV[VZ] < rightFootWorldPosition.mV[VZ]) -		{ -			// pivot on left foot -			footCorrection = leftFootDelta; -		} +	if (speed > MIN_WALK_SPEED) +	{	// walking/running + +		// calculate world-space foot drift +		// use global coordinates to seamlessly handle region crossings +		LLVector3d leftFootGlobalPosition = mCharacter->getPosGlobalFromAgent(mLeftAnkleJoint->getWorldPosition()); +		leftFootGlobalPosition.mdV[VZ] = 0.0; +		LLVector3 leftFootDelta(leftFootGlobalPosition - mLastLeftFootGlobalPos); +		mLastLeftFootGlobalPos = leftFootGlobalPosition; + +		LLVector3d rightFootGlobalPosition = mCharacter->getPosGlobalFromAgent(mRightAnkleJoint->getWorldPosition()); +		rightFootGlobalPosition.mdV[VZ] = 0.0; +		LLVector3 rightFootDelta(rightFootGlobalPosition - mLastRightFootGlobalPos); +		mLastRightFootGlobalPos = rightFootGlobalPosition; + +		// get foot drift along avatar direction of motion +		F32 left_foot_slip_amt = leftFootDelta * avatar_velocity; +		F32 right_foot_slip_amt = rightFootDelta * avatar_velocity; + +		// if right foot is pushing back faster than left foot... +		if (right_foot_slip_amt < left_foot_slip_amt) +		{	//...use it to calculate optimal animation speed +			foot_slip_vector = rightFootDelta; +		}   		else -		{ -			// pivot on right foot -			footCorrection = rightFootDelta; +		{	// otherwise use the left foot +			foot_slip_vector = leftFootDelta;  		} -	} -	// rotate into avatar coordinates -	footCorrection = footCorrection * inv_rotation; +		// calculate ideal pelvis offset so that foot is glued to ground and damp towards it +		// this will soak up transient slippage +		// +		// FIXME: this interacts poorly with speed adjustment +		// mPelvisOffset compensates for foot drift by moving the avatar pelvis in the opposite +		// direction of the drift, up to a certain limited distance +		// but this will cause the animation playback rate calculation below to  +		// kick in too slowly and sometimes start playing the animation in reverse. -	// calculate ideal pelvis offset so that foot is glued to ground and damp towards it -	// the amount of foot slippage this frame + the offset applied last frame -	mPelvisOffset = mPelvisState->getPosition() + lerp(LLVector3::zero, footCorrection, LLCriticalDamp::getInterpolant(0.2f)); +		//mPelvisOffset -= PELVIS_COMPENSATION_WIEGHT * (foot_slip_vector * world_to_avatar_rot);//lerp(LLVector3::zero, -1.f * (foot_slip_vector * world_to_avatar_rot), LLCriticalDamp::getInterpolant(0.1f)); -	// pelvis drift (along walk direction) -	mAvgCorrection = lerp(mAvgCorrection, footCorrection.mV[VX] * mRelativeDir, LLCriticalDamp::getInterpolant(0.1f)); +		////F32 drift_comp_max = DRIFT_COMP_MAX_TOTAL * (llclamp(speed, 0.f, DRIFT_COMP_MAX_SPEED) / DRIFT_COMP_MAX_SPEED); +		//F32 drift_comp_max = DRIFT_COMP_MAX_TOTAL; -	// calculate average velocity of foot slippage -	F32 footSlipVelocity = (deltaTime != 0.f) ? (-mAvgCorrection / deltaTime) : 0.f; +		//// clamp pelvis offset to a 90 degree arc behind the nominal position +		//// NB: this is an ADDITIVE amount that is accumulated every frame, so clamping it alone won't do the trick +		//// must clamp with absolute position of pelvis in mind +		//LLVector3 currentPelvisPos = mPelvisState->getJoint()->getPosition(); +		//mPelvisOffset.mV[VX] = llclamp( mPelvisOffset.mV[VX], -drift_comp_max, drift_comp_max ); +		//mPelvisOffset.mV[VY] = llclamp( mPelvisOffset.mV[VY], -drift_comp_max, drift_comp_max ); +		//mPelvisOffset.mV[VZ] = 0.f; +		// +		//mLastRightFootGlobalPos += LLVector3d(mPelvisOffset * avatar_to_world_rot); +		//mLastLeftFootGlobalPos += LLVector3d(mPelvisOffset * avatar_to_world_rot); -	F32 newSpeedAdjust = 0.f; -	 -	// modulate speed by dot products of facing and velocity -	// so that if we are moving sideways, we slow down the animation -	// and if we're moving backward, we walk backward +		//foot_slip_vector -= mPelvisOffset; -	F32 directional_factor = localVel.mV[VX] * mRelativeDir; +		LLVector3 avatar_movement_dir = avatar_velocity; +		avatar_movement_dir.normalize(); -	if (speed > 0.1f) -	{ -		// calculate ratio of desired foot velocity to detected foot velocity -		newSpeedAdjust = llclamp(footSlipVelocity - mAvgSpeed * (1.f - directional_factor),  -								-SPEED_ADJUST_MAX, SPEED_ADJUST_MAX); -		newSpeedAdjust = lerp(mSpeedAdjust, newSpeedAdjust, LLCriticalDamp::getInterpolant(0.2f)); +		// planted foot speed is avatar velocity - foot slip amount along avatar movement direction +		F32 foot_speed = speed - ((foot_slip_vector * avatar_movement_dir) / delta_time); -		F32 speedDelta = newSpeedAdjust - mSpeedAdjust; -		speedDelta = llclamp(speedDelta, -SPEED_ADJUST_MAX_SEC * deltaTime, SPEED_ADJUST_MAX_SEC * deltaTime); +		// multiply animation playback rate so that foot speed matches avatar speed +		F32 desired_speed_multiplier = llclamp(speed / foot_speed, 0.f, ANIM_SPEED_MAX); -		mSpeedAdjust = mSpeedAdjust + speedDelta; -	} -	else -	{ -		mSpeedAdjust = lerp(mSpeedAdjust, 0.f, LLCriticalDamp::getInterpolant(0.2f)); -	} +		// blend towards new speed adjustment value +		F32 new_speed_adjust = lerp(mAdjustedSpeed, desired_speed_multiplier, LLCriticalDamp::getInterpolant(SPEED_ADJUST_TIME_CONSTANT)); -	mAnimSpeed = (mAvgSpeed + mSpeedAdjust) * mRelativeDir; -	if (mAnimSpeed>0) -	{ -		mAnimSpeed = llclamp(mAnimSpeed, ANIM_SPEED_MIN, ANIM_SPEED_MAX); +		// limit that rate at which the speed adjustment changes +		F32 speedDelta = llclamp(new_speed_adjust - mAdjustedSpeed, -SPEED_ADJUST_MAX_SEC * delta_time, SPEED_ADJUST_MAX_SEC * delta_time); +		mAdjustedSpeed += speedDelta; + +		// modulate speed by dot products of facing and velocity +		// so that if we are moving sideways, we slow down the animation +		// and if we're moving backward, we walk backward +		// do this at the end to be more responsive to direction changes instead of in the above speed calculations +		F32 directional_factor = (avatar_movement_dir * world_to_avatar_rot).mV[VX]; + +		mAnimSpeed = mAdjustedSpeed * directional_factor;  	}  	else -	{ -		mAnimSpeed = llclamp(mAnimSpeed, -ANIM_SPEED_MAX, -ANIM_SPEED_MIN); -	} -// 	char debug_text[64]; -// 	sprintf(debug_text, "Foot slip vel: %.2f", footSlipVelocity); -// 	mCharacter->addDebugText(debug_text); -// 	sprintf(debug_text, "Speed: %.2f", mAvgSpeed); -// 	mCharacter->addDebugText(debug_text); -// 	sprintf(debug_text, "Speed Adjust: %.2f", mSpeedAdjust); -// 	mCharacter->addDebugText(debug_text); -// 	sprintf(debug_text, "Animation Playback Speed: %.2f", mAnimSpeed); -// 	mCharacter->addDebugText(debug_text); - 	mCharacter->setAnimationData("Walk Speed", &mAnimSpeed); -	if (mCharacter->getMotionController().mIsSelf) -	{ -//		F32 elapsed = mCharacter->getMotionController().getFrameTimer().getElapsedTimeF32(); -// 		llinfos << "PLOT elapsed: " << elapsed  -// 				<< " footSlipVelocity: " << footSlipVelocity -// 				<< " mAvgCorrection: " << mAvgCorrection -// 				<< " mAvgSpeed: " << mAvgSpeed -// 				<< " mAnimSpeed: " << mAnimSpeed -// 				<< " ANIM_SPEED_MAX: " << ANIM_SPEED_MAX -// 				<< " ANIM_SPEED_MIN: " << ANIM_SPEED_MIN -// 				<< llendl; -	} - -	// clamp pelvis offset to a 90 degree arc behind the nominal position -	F32 drift_comp_max = llclamp(speed, 0.f, DRIFT_COMP_MAX_SPEED) / DRIFT_COMP_MAX_SPEED; -	drift_comp_max *= DRIFT_COMP_MAX_TOTAL; +	{	// standing/turning -	LLVector3 currentPelvisPos = mPelvisState->getJoint()->getPosition(); +		// damp out speed adjustment to 0 +		mAnimSpeed = lerp(mAnimSpeed, 1.f, LLCriticalDamp::getInterpolant(0.2f)); +		//mPelvisOffset = lerp(mPelvisOffset, LLVector3::zero, LLCriticalDamp::getInterpolant(0.2f)); +	} -	// NB: this is an ADDITIVE amount that is accumulated every frame, so clamping it alone won't do the trick -	// must clamp with absolute position of pelvis in mind -	mPelvisOffset.mV[VX] = llclamp( mPelvisOffset.mV[VX], -drift_comp_max - currentPelvisPos.mV[VX], drift_comp_max - currentPelvisPos.mV[VX]  ); -	mPelvisOffset.mV[VY] = llclamp( mPelvisOffset.mV[VY], -drift_comp_max - currentPelvisPos.mV[VY], drift_comp_max - currentPelvisPos.mV[VY]); -	mPelvisOffset.mV[VZ] = 0.f; +	// broadcast walk speed change + 	mCharacter->setAnimationData("Walk Speed", &mAnimSpeed);  	// set position +	// need to update *some* joint to keep this animation active  	mPelvisState->setPosition(mPelvisOffset); -	mCharacter->setAnimationData("Pelvis Offset", &mPelvisOffset); -  	return TRUE;  } @@ -438,14 +390,8 @@ BOOL LLFlyAdjustMotion::onUpdate(F32 time, U8* joint_mask)  	// roll is critically damped interpolation between current roll and angular velocity-derived target roll  	mRoll = lerp(mRoll, target_roll, LLCriticalDamp::getInterpolant(0.1f)); -//	llinfos << mRoll << llendl; -  	LLQuaternion roll(mRoll, LLVector3(0.f, 0.f, 1.f));  	mPelvisState->setRotation(roll); -//	F32 lerp_amt = LLCriticalDamp::getInterpolant(0.2f); -//	 -//	LLVector3 pelvis_correction = mPelvisState->getPosition() - lerp(LLVector3::zero, mPelvisState->getJoint()->getPosition() + mPelvisState->getPosition(), lerp_amt); -//	mPelvisState->setPosition(pelvis_correction);  	return TRUE;  } diff --git a/indra/llcharacter/llkeyframewalkmotion.h b/indra/llcharacter/llkeyframewalkmotion.h index 90dd4dbcac..b507e9423a 100644 --- a/indra/llcharacter/llkeyframewalkmotion.h +++ b/indra/llcharacter/llkeyframewalkmotion.h @@ -126,13 +126,11 @@ public:  	LLJoint*		mRightAnkleJoint;  	LLPointer<LLJointState>	mPelvisState;  	LLJoint*		mPelvisJoint; -	LLVector3d		mLastLeftAnklePos; -	LLVector3d		mLastRightAnklePos; +	LLVector3d		mLastLeftFootGlobalPos; +	LLVector3d		mLastRightFootGlobalPos;  	F32				mLastTime; -	F32				mAvgCorrection; -	F32				mSpeedAdjust; +	F32				mAdjustedSpeed;  	F32				mAnimSpeed; -	F32				mAvgSpeed;  	F32				mRelativeDir;  	LLVector3		mPelvisOffset;  	F32				mAnkleOffset; diff --git a/indra/llimage/llimagepng.cpp b/indra/llimage/llimagepng.cpp index a6ab246a2c..018ce993b5 100644 --- a/indra/llimage/llimagepng.cpp +++ b/indra/llimage/llimagepng.cpp @@ -42,17 +42,12 @@  // LLImagePNG  // ---------------------------------------------------------------------------  LLImagePNG::LLImagePNG() -    : LLImageFormatted(IMG_CODEC_PNG), -	  mTmpWriteBuffer(NULL) +    : LLImageFormatted(IMG_CODEC_PNG)  {  }  LLImagePNG::~LLImagePNG()  { -	if (mTmpWriteBuffer) -	{ -		delete[] mTmpWriteBuffer; -	}  }  // Virtual @@ -123,28 +118,24 @@ BOOL LLImagePNG::encode(const LLImageRaw* raw_image, F32 encode_time)  	// Temporary buffer to hold the encoded image. Note: the final image  	// size should be much smaller due to compression. -	if (mTmpWriteBuffer) -	{ -		delete[] mTmpWriteBuffer; -	}  	U32 bufferSize = getWidth() * getHeight() * getComponents() + 1024; -    U8* mTmpWriteBuffer = new U8[ bufferSize ]; +    U8* tmpWriteBuffer = new U8[ bufferSize ];  	// Delegate actual encoding work to wrapper  	LLPngWrapper pngWrapper; -	if (! pngWrapper.writePng(raw_image, mTmpWriteBuffer)) +	if (! pngWrapper.writePng(raw_image, tmpWriteBuffer))  	{  		setLastError(pngWrapper.getErrorMessage()); -		delete[] mTmpWriteBuffer; +		delete[] tmpWriteBuffer;  		return FALSE;  	}  	// Resize internal buffer and copy from temp  	U32 encodedSize = pngWrapper.getFinalSize();  	allocateData(encodedSize); -	memcpy(getData(), mTmpWriteBuffer, encodedSize); +	memcpy(getData(), tmpWriteBuffer, encodedSize); -	delete[] mTmpWriteBuffer; +	delete[] tmpWriteBuffer;  	return TRUE;  } diff --git a/indra/llimage/llimagepng.h b/indra/llimage/llimagepng.h index 083dda73b9..4d6e2ee70a 100644 --- a/indra/llimage/llimagepng.h +++ b/indra/llimage/llimagepng.h @@ -47,9 +47,6 @@ public:  	/*virtual*/ BOOL updateData();  	/*virtual*/ BOOL decode(LLImageRaw* raw_image, F32 decode_time);  	/*virtual*/ BOOL encode(const LLImageRaw* raw_image, F32 encode_time); - -private: -	U8* mTmpWriteBuffer;  };  #endif diff --git a/indra/llmath/tests/mathmisc_test.cpp b/indra/llmath/tests/mathmisc_test.cpp index ea42f6e001..68d9ddc0fe 100644 --- a/indra/llmath/tests/mathmisc_test.cpp +++ b/indra/llmath/tests/mathmisc_test.cpp @@ -334,6 +334,8 @@ namespace tut  	template<> template<>  	void sphere_object::test<2>()  	{ +		skip("See SNOW-620.  Neither the test nor the code being tested seem good.  Also sim-only."); +  		// test LLSphere::getBoundingSphere()  		S32 number_of_tests = 100;  		S32 number_of_spheres = 10; diff --git a/indra/media_plugins/gstreamer010/CMakeLists.txt b/indra/media_plugins/gstreamer010/CMakeLists.txt index 3b73e04786..9f0ff654fc 100644 --- a/indra/media_plugins/gstreamer010/CMakeLists.txt +++ b/indra/media_plugins/gstreamer010/CMakeLists.txt @@ -42,12 +42,12 @@ set(media_plugin_gstreamer010_HEADER_FILES      llmediaimplgstreamertriviallogging.h      ) -if (${CXX_VERSION_NUMBER} MATCHES "4[23].") +if (${CXX_VERSION_NUMBER} MATCHES "4[23456789].")      # Work around a bad interaction between broken gstreamer headers and -    # g++ 4.3's increased strictness. +    # g++ >= 4.2's increased strictness.      set_source_files_properties(llmediaimplgstreamervidplug.cpp PROPERTIES                                  COMPILE_FLAGS -Wno-write-strings) -endif (${CXX_VERSION_NUMBER} MATCHES "4[23].") +endif (${CXX_VERSION_NUMBER} MATCHES "4[23456789].")  add_library(media_plugin_gstreamer010      SHARED diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index 0cd6e48d14..6990354486 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -297,11 +297,8 @@ private:  		// append details to agent string  		LLQtWebKit::getInstance()->setBrowserAgentId( mUserAgent ); -		// TODO: Remove this ifdef when the Linux version of llqtwebkit gets updated with the new WOB constant. -#if !LL_LINUX  		// Set up window open behavior  		LLQtWebKit::getInstance()->setWindowOpenBehavior(mBrowserWindowId, LLQtWebKit::WOB_SIMULATE_BLANK_HREF_CLICK); -#endif  #if !LL_QTWEBKIT_USES_PIXMAPS  		// don't flip bitmap diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f9a1dfb0dc..5b70e4bcb0 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -3545,6 +3545,17 @@        <key>Value</key>        <real>9.0</real>      </map> +    <key>ForceAssetFail</key> +    <map> +      <key>Comment</key> +      <string>Force wearable fetches to fail for this asset type.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>255</integer> +    </map>      <key>ForceShowGrid</key>      <map>        <key>Comment</key> @@ -5064,6 +5075,17 @@        <key>Value</key>        <real>64.0</real>      </map> +    <key>MaxWearableWaitTime</key> +    <map> +      <key>Comment</key> +      <string>Max seconds to wait for wearable assets to fetch.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>60.0</real> +    </map>      <key>MeanCollisionBump</key>      <map>        <key>Comment</key> @@ -10888,7 +10910,7 @@        <key>Type</key>        <string>Boolean</string>        <key>Value</key> -      <integer>0</integer> +      <integer>1</integer>      </map>      <key>UseStartScreen</key>      <map> diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 977f1c9fa8..3fc5e88633 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -207,13 +207,13 @@ void LLAgentCamera::init()  	mCameraPreset = (ECameraPreset) gSavedSettings.getU32("CameraPreset"); -	mCameraOffsetInitial[CAMERA_PRESET_REAR_VIEW] = gSavedSettings.getVector3("CameraOffsetRearView"); -	mCameraOffsetInitial[CAMERA_PRESET_FRONT_VIEW] = gSavedSettings.getVector3("CameraOffsetFrontView"); -	mCameraOffsetInitial[CAMERA_PRESET_GROUP_VIEW] = gSavedSettings.getVector3("CameraOffsetGroupView"); +	mCameraOffsetInitial[CAMERA_PRESET_REAR_VIEW] = gSavedSettings.getControl("CameraOffsetRearView"); +	mCameraOffsetInitial[CAMERA_PRESET_FRONT_VIEW] = gSavedSettings.getControl("CameraOffsetFrontView"); +	mCameraOffsetInitial[CAMERA_PRESET_GROUP_VIEW] = gSavedSettings.getControl("CameraOffsetGroupView"); -	mFocusOffsetInitial[CAMERA_PRESET_REAR_VIEW] = gSavedSettings.getVector3d("FocusOffsetRearView"); -	mFocusOffsetInitial[CAMERA_PRESET_FRONT_VIEW] = gSavedSettings.getVector3d("FocusOffsetFrontView"); -	mFocusOffsetInitial[CAMERA_PRESET_GROUP_VIEW] = gSavedSettings.getVector3d("FocusOffsetGroupView"); +	mFocusOffsetInitial[CAMERA_PRESET_REAR_VIEW] = gSavedSettings.getControl("FocusOffsetRearView"); +	mFocusOffsetInitial[CAMERA_PRESET_FRONT_VIEW] = gSavedSettings.getControl("FocusOffsetFrontView"); +	mFocusOffsetInitial[CAMERA_PRESET_GROUP_VIEW] = gSavedSettings.getControl("FocusOffsetGroupView");  	mCameraCollidePlane.clearVec();  	mCurrentCameraDistance = getCameraOffsetInitial().magVec() * gSavedSettings.getF32("CameraOffsetScale"); @@ -1643,7 +1643,7 @@ LLVector3d LLAgentCamera::calcThirdPersonFocusOffset()  		agent_rot *= ((LLViewerObject*)(gAgentAvatarp->getParent()))->getRenderRotation();  	} -	focus_offset = mFocusOffsetInitial[mCameraPreset] * agent_rot; +	focus_offset = convert_from_llsd<LLVector3d>(mFocusOffsetInitial[mCameraPreset]->get(), TYPE_VEC3D, "");  	return focus_offset;  } @@ -1978,7 +1978,7 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit)  LLVector3 LLAgentCamera::getCameraOffsetInitial()  { -	return mCameraOffsetInitial[mCameraPreset]; +	return convert_from_llsd<LLVector3>(mCameraOffsetInitial[mCameraPreset]->get(), TYPE_VEC3, "");  } diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h index 5cbb1de6f4..7afb5c0ed9 100644 --- a/indra/newview/llagentcamera.h +++ b/indra/newview/llagentcamera.h @@ -39,6 +39,7 @@  class LLPickInfo;  class LLVOAvatarSelf; +class LLControlVariable;  //--------------------------------------------------------------------  // Types @@ -121,10 +122,10 @@ private:  	ECameraPreset mCameraPreset;   	/** Initial camera offsets */ -	std::map<ECameraPreset, LLVector3> mCameraOffsetInitial; +	std::map<ECameraPreset, LLPointer<LLControlVariable> > mCameraOffsetInitial;  	/** Initial focus offsets */ -	std::map<ECameraPreset, LLVector3d> mFocusOffsetInitial; +	std::map<ECameraPreset, LLPointer<LLControlVariable> > mFocusOffsetInitial;  	//--------------------------------------------------------------------  	// Position diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index a7206095d3..3c267b3308 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -216,13 +216,15 @@ struct LLFoundData  				const LLUUID& asset_id,  				const std::string& name,  				const LLAssetType::EType& asset_type, -				const LLWearableType::EType& wearable_type +				const LLWearableType::EType& wearable_type, +				const bool is_replacement = false  		) :  		mItemID(item_id),  		mAssetID(asset_id),  		mName(name),  		mAssetType(asset_type),  		mWearableType(wearable_type), +		mIsReplacement(is_replacement),  		mWearable( NULL ) {}  	LLUUID mItemID; @@ -231,6 +233,7 @@ struct LLFoundData  	LLAssetType::EType mAssetType;  	LLWearableType::EType mWearableType;  	LLWearable* mWearable; +	bool mIsReplacement;  }; @@ -253,8 +256,18 @@ public:  	void onWearableAssetFetch(LLWearable *wearable);  	void onAllComplete(); -	 +  	typedef std::list<LLFoundData> found_list_t; +	found_list_t& getFoundList(); +	void eraseTypeToLink(LLWearableType::EType type); +	void eraseTypeToRecover(LLWearableType::EType type); +	void setObjItems(const LLInventoryModel::item_array_t& items); +	void setGestItems(const LLInventoryModel::item_array_t& items); +	bool isMostRecent(); +	void handleLateArrivals(); +	void resetTime(F32 timeout); +	 +private:  	found_list_t mFoundList;  	LLInventoryModel::item_array_t mObjItems;  	LLInventoryModel::item_array_t mGestItems; @@ -264,34 +277,94 @@ public:  	S32 mResolved;  	LLTimer mWaitTime;  	bool mFired; +	typedef std::set<LLWearableHoldingPattern*> type_set_hp; +	static type_set_hp sActiveHoldingPatterns; +	bool mIsMostRecent; +	std::set<LLWearable*> mLateArrivals; +	bool mIsAllComplete;  }; +LLWearableHoldingPattern::type_set_hp LLWearableHoldingPattern::sActiveHoldingPatterns; +  LLWearableHoldingPattern::LLWearableHoldingPattern():  	mResolved(0), -	mFired(false) +	mFired(false), +	mIsMostRecent(true), +	mIsAllComplete(false)  { +	if (sActiveHoldingPatterns.size()>0) +	{ +		llinfos << "Creating LLWearableHoldingPattern when " +				<< sActiveHoldingPatterns.size() +				<< " other attempts are active." +				<< " Flagging others as invalid." +				<< llendl; +		for (type_set_hp::iterator it = sActiveHoldingPatterns.begin(); +			 it != sActiveHoldingPatterns.end(); +			 ++it) +		{ +			(*it)->mIsMostRecent = false; +		} +			  +	} +	sActiveHoldingPatterns.insert(this);  }  LLWearableHoldingPattern::~LLWearableHoldingPattern()  { +	sActiveHoldingPatterns.erase(this); +} + +bool LLWearableHoldingPattern::isMostRecent() +{ +	return mIsMostRecent; +} + +LLWearableHoldingPattern::found_list_t& LLWearableHoldingPattern::getFoundList() +{ +	return mFoundList; +} + +void LLWearableHoldingPattern::eraseTypeToLink(LLWearableType::EType type) +{ +	mTypesToLink.erase(type); +} + +void LLWearableHoldingPattern::eraseTypeToRecover(LLWearableType::EType type) +{ +	mTypesToRecover.erase(type); +} + +void LLWearableHoldingPattern::setObjItems(const LLInventoryModel::item_array_t& items) +{ +	mObjItems = items; +} + +void LLWearableHoldingPattern::setGestItems(const LLInventoryModel::item_array_t& items) +{ +	mGestItems = items;  }  bool LLWearableHoldingPattern::isFetchCompleted()  { -	return (mResolved >= (S32)mFoundList.size()); // have everything we were waiting for? +	return (mResolved >= (S32)getFoundList().size()); // have everything we were waiting for?  }  bool LLWearableHoldingPattern::isTimedOut()  { -	static F32 max_wait_time = 60.0;  // give up if wearable fetches haven't completed in max_wait_time seconds. -	return mWaitTime.getElapsedTimeF32() > max_wait_time;  +	return mWaitTime.hasExpired();  }  void LLWearableHoldingPattern::checkMissingWearables()  { +	if (!isMostRecent()) +	{ +		llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; +	} +		  	std::vector<S32> found_by_type(LLWearableType::WT_COUNT,0);  	std::vector<S32> requested_by_type(LLWearableType::WT_COUNT,0); -	for (found_list_t::iterator it = mFoundList.begin(); it != mFoundList.end(); ++it) +	for (found_list_t::iterator it = getFoundList().begin(); it != getFoundList().end(); ++it)  	{  		LLFoundData &data = *it;  		if (data.mWearableType < LLWearableType::WT_COUNT) @@ -322,7 +395,7 @@ void LLWearableHoldingPattern::checkMissingWearables()  		}  	} -	mWaitTime.reset(); +	resetTime(60.0F);  	if (!pollMissingWearables())  	{  		doOnIdleRepeating(boost::bind(&LLWearableHoldingPattern::pollMissingWearables,this)); @@ -331,6 +404,11 @@ void LLWearableHoldingPattern::checkMissingWearables()  void LLWearableHoldingPattern::onAllComplete()  { +	if (!isMostRecent()) +	{ +		llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; +	} +  	// Activate all gestures in this folder  	if (mGestItems.count() > 0)  	{ @@ -366,16 +444,31 @@ void LLWearableHoldingPattern::onAllComplete()  		// Only safe to delete if all wearable callbacks and all missing wearables completed.  		delete this;  	} +	else +	{ +		mIsAllComplete = true; +		handleLateArrivals(); +	}  }  void LLWearableHoldingPattern::onFetchCompletion()  { +	if (!isMostRecent()) +	{ +		llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; +	} +  	checkMissingWearables();  }  // Runs as an idle callback until all wearables are fetched (or we time out).  bool LLWearableHoldingPattern::pollFetchCompletion()  { +	if (!isMostRecent()) +	{ +		llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; +	} +  	bool completed = isFetchCompleted();  	bool timed_out = isTimedOut();  	bool done = completed || timed_out; @@ -408,8 +501,13 @@ public:  	}  	void fire(const LLUUID& item_id)  	{ +		if (!mHolder->isMostRecent()) +		{ +			llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; +		} +  		llinfos << "Recovered item link for type " << mType << llendl; -		mHolder->mTypesToLink.erase(mType); +		mHolder->eraseTypeToLink(mType);  		// Add wearable to FoundData for actual wearing  		LLViewerInventoryItem *item = gInventory.getItem(item_id);  		LLViewerInventoryItem *linked_item = item ? item->getLinkedItem() : NULL; @@ -421,13 +519,14 @@ public:  			if (item)  			{  				LLFoundData found(linked_item->getUUID(), -						  linked_item->getAssetUUID(), -						  linked_item->getName(), -						  linked_item->getType(), -						  linked_item->isWearableType() ? linked_item->getWearableType() : LLWearableType::WT_INVALID -						  ); +								  linked_item->getAssetUUID(), +								  linked_item->getName(), +								  linked_item->getType(), +								  linked_item->isWearableType() ? linked_item->getWearableType() : LLWearableType::WT_INVALID, +								  true // is replacement +					);  				found.mWearable = mWearable; -				mHolder->mFoundList.push_front(found); +				mHolder->getFoundList().push_front(found);  			}  			else  			{ @@ -456,11 +555,16 @@ public:  	}  	void fire(const LLUUID& item_id)  	{ +		if (!mHolder->isMostRecent()) +		{ +			llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; +		} +  		llinfos << "Recovered item for type " << mType << llendl;  		LLViewerInventoryItem *itemp = gInventory.getItem(item_id);  		mWearable->setItemID(item_id);  		LLPointer<LLInventoryCallback> cb = new RecoveredItemLinkCB(mType,mWearable,mHolder); -		mHolder->mTypesToRecover.erase(mType); +		mHolder->eraseTypeToRecover(mType);  		llassert(itemp);  		if (itemp)  		{ @@ -481,6 +585,11 @@ private:  void LLWearableHoldingPattern::recoverMissingWearable(LLWearableType::EType type)  { +	if (!isMostRecent()) +	{ +		llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; +	} +	  		// Try to recover by replacing missing wearable with a new one.  	LLNotificationsUtil::add("ReplacedMissingWearable");  	lldebugs << "Wearable " << LLWearableType::getTypeLabel(type) @@ -511,7 +620,7 @@ bool LLWearableHoldingPattern::isMissingCompleted()  void LLWearableHoldingPattern::clearCOFLinksForMissingWearables()  { -	for (found_list_t::iterator it = mFoundList.begin(); it != mFoundList.end(); ++it) +	for (found_list_t::iterator it = getFoundList().begin(); it != getFoundList().end(); ++it)  	{  		LLFoundData &data = *it;  		if ((data.mWearableType < LLWearableType::WT_COUNT) && (!data.mWearable)) @@ -525,6 +634,11 @@ void LLWearableHoldingPattern::clearCOFLinksForMissingWearables()  bool LLWearableHoldingPattern::pollMissingWearables()  { +	if (!isMostRecent()) +	{ +		llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; +	} +	  	bool timed_out = isTimedOut();  	bool missing_completed = isMissingCompleted();  	bool done = timed_out || missing_completed; @@ -544,10 +658,103 @@ bool LLWearableHoldingPattern::pollMissingWearables()  	return done;  } +// Handle wearables that arrived after the timeout period expired. +void LLWearableHoldingPattern::handleLateArrivals() +{ +	// Only safe to run if we have previously finished the missing +	// wearables and other processing - otherwise we could be in some +	// intermediate state - but have not been superceded by a later +	// outfit change request. +	if (mLateArrivals.size() == 0) +	{ +		// Nothing to process. +		return; +	} +	if (!isMostRecent()) +	{ +		llwarns << "Late arrivals not handled - outfit change no longer valid" << llendl; +	} +	if (!mIsAllComplete) +	{ +		llwarns << "Late arrivals not handled - in middle of missing wearables processing" << llendl; +	} + +	llinfos << "Need to handle " << mLateArrivals.size() << " late arriving wearables" << llendl; + +	// Update mFoundList using late-arriving wearables. +	std::set<LLWearableType::EType> replaced_types; +	for (LLWearableHoldingPattern::found_list_t::iterator iter = getFoundList().begin(); +		 iter != getFoundList().end(); ++iter) +	{ +		LLFoundData& data = *iter; +		for (std::set<LLWearable*>::iterator wear_it = mLateArrivals.begin(); +			 wear_it != mLateArrivals.end(); +			 ++wear_it) +		{ +			LLWearable *wearable = *wear_it; + +			if(wearable->getAssetID() == data.mAssetID) +			{ +				data.mWearable = wearable; + +				replaced_types.insert(data.mWearableType); +				 +				LLAppearanceMgr::instance().addCOFItemLink(data.mItemID,false); + +				// BAP failing this means inventory or asset server +				// are corrupted in a way we don't handle. +				llassert((data.mWearableType < LLWearableType::WT_COUNT) && (wearable->getType() == data.mWearableType)); +				break; +			} +		} +	} + +	// Remove COF links for any default wearables previously used to replace the late arrivals. +	// All this pussyfooting around with a while loop and explicit +	// iterator incrementing is to allow removing items from the list +	// without clobbering the iterator we're using to navigate. +	LLWearableHoldingPattern::found_list_t::iterator iter = getFoundList().begin(); +	while (iter != getFoundList().end()) +	{ +		LLFoundData& data = *iter; + +		// If an item of this type has recently shown up, removed the corresponding replacement wearable from COF. +		if (data.mWearable && data.mIsReplacement && +			replaced_types.find(data.mWearableType) != replaced_types.end()) +		{ +			LLAppearanceMgr::instance().removeCOFItemLinks(data.mItemID,false); +			std::list<LLFoundData>::iterator clobber_ator = iter; +			++iter; +			getFoundList().erase(clobber_ator); +		} +		else +		{ +			++iter; +		} +	} + +	// Clear contents of late arrivals. +	mLateArrivals.clear(); + +	// Update appearance based on mFoundList +	LLAppearanceMgr::instance().updateAgentWearables(this, false); +} + +void LLWearableHoldingPattern::resetTime(F32 timeout) +{ +	mWaitTime.reset(); +	mWaitTime.setTimerExpirySec(timeout); +} +  void LLWearableHoldingPattern::onWearableAssetFetch(LLWearable *wearable)  { +	if (!isMostRecent()) +	{ +		llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; +	} +	  	mResolved += 1;  // just counting callbacks, not successes. -	llinfos << "onWearableAssetFetch, resolved count " << mResolved << " of requested " << mFoundList.size() << llendl; +	llinfos << "onWearableAssetFetch, resolved count " << mResolved << " of requested " << getFoundList().size() << llendl;  	if (wearable)  	{  		llinfos << "wearable found, type " << wearable->getType() << " asset " << wearable->getAssetID() << llendl; @@ -560,6 +767,14 @@ void LLWearableHoldingPattern::onWearableAssetFetch(LLWearable *wearable)  	if (mFired)  	{  		llwarns << "called after holder fired" << llendl; +		if (wearable) +		{ +			mLateArrivals.insert(wearable); +			if (mIsAllComplete) +			{ +				handleLateArrivals(); +			} +		}  		return;  	} @@ -568,8 +783,8 @@ void LLWearableHoldingPattern::onWearableAssetFetch(LLWearable *wearable)  		return;  	} -	for (LLWearableHoldingPattern::found_list_t::iterator iter = mFoundList.begin(); -		 iter != mFoundList.end(); ++iter) +	for (LLWearableHoldingPattern::found_list_t::iterator iter = getFoundList().begin(); +		 iter != getFoundList().end(); ++iter)  	{  		LLFoundData& data = *iter;  		if(wearable->getAssetID() == data.mAssetID) @@ -1068,8 +1283,9 @@ void LLAppearanceMgr::linkAll(const LLUUID& cat_uuid,  		const LLViewerInventoryCategory *cat = gInventory.getCategory(cat_uuid);  		const std::string cat_name = cat ? cat->getName() : "CAT NOT FOUND"; - -		llinfos << "Linking Item [ name:" << item->getName() << " UUID:" << item->getUUID() << " ] to Category [ name:" << cat_name << " UUID:" << cat_uuid << " ] " << llendl; // Seraph remove for 2.1 +#ifndef LL_RELEASE_FOR_DOWNLOAD +		llinfos << "Linking Item [ name:" << item->getName() << " UUID:" << item->getUUID() << " ] to Category [ name:" << cat_name << " UUID:" << cat_uuid << " ] " << llendl; +#endif  	}  } @@ -1138,13 +1354,24 @@ void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)  	llinfos << "creating LLUpdateAppearanceOnDestroy" << llendl;  	LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy; -	llinfos << "Linking body items" << llendl; // Seraph remove for 2.1 +#ifndef LL_RELEASE_FOR_DOWNLOAD +	llinfos << "Linking body items" << llendl; +#endif  	linkAll(cof, body_items, link_waiter); -	llinfos << "Linking wear items" << llendl; // Seraph remove for 2.1 + +#ifndef LL_RELEASE_FOR_DOWNLOAD +	llinfos << "Linking wear items" << llendl; +#endif  	linkAll(cof, wear_items, link_waiter); -	llinfos << "Linking obj items" << llendl; // Seraph remove for 2.1 + +#ifndef LL_RELEASE_FOR_DOWNLOAD +	llinfos << "Linking obj items" << llendl; +#endif  	linkAll(cof, obj_items, link_waiter); -	llinfos << "Linking gesture items" << llendl; // Seraph remove for 2.1 + +#ifndef LL_RELEASE_FOR_DOWNLOAD +	llinfos << "Linking gesture items" << llendl; +#endif  	linkAll(cof, gest_items, link_waiter);  	// Add link to outfit if category is an outfit.  @@ -1189,12 +1416,11 @@ void LLAppearanceMgr::updateAgentWearables(LLWearableHoldingPattern* holder, boo  	LLInventoryItem::item_array_t items;  	LLDynamicArray< LLWearable* > wearables; -	// For each wearable type, find the first instance in the category -	// that we recursed through. +	// For each wearable type, find the wearables of that type.  	for( S32 i = 0; i < LLWearableType::WT_COUNT; i++ )  	{ -		for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin(); -			 iter != holder->mFoundList.end(); ++iter) +		for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->getFoundList().begin(); +			 iter != holder->getFoundList().end(); ++iter)  		{  			LLFoundData& data = *iter;  			LLWearable* wearable = data.mWearable; @@ -1286,8 +1512,8 @@ void LLAppearanceMgr::updateAppearanceFromCOF()  	LLWearableHoldingPattern* holder = new LLWearableHoldingPattern; -	holder->mObjItems = obj_items; -	holder->mGestItems = gest_items; +	holder->setObjItems(obj_items); +	holder->setGestItems(gest_items);  	// Note: can't do normal iteration, because if all the  	// wearables can be resolved immediately, then the @@ -1298,6 +1524,12 @@ void LLAppearanceMgr::updateAppearanceFromCOF()  	{  		LLViewerInventoryItem *item = wear_items.get(i);  		LLViewerInventoryItem *linked_item = item ? item->getLinkedItem() : NULL; + +		// Fault injection: use debug setting to test asset  +		// fetch failures (should be replaced by new defaults in +		// lost&found). +		U32 skip_type = gSavedSettings.getU32("ForceAssetFail"); +  		if (item && item->getIsLinkType() && linked_item)  		{  			LLFoundData found(linked_item->getUUID(), @@ -1307,18 +1539,12 @@ void LLAppearanceMgr::updateAppearanceFromCOF()  							  linked_item->isWearableType() ? linked_item->getWearableType() : LLWearableType::WT_INVALID  				); -#if 0 -			// Fault injection: uncomment this block to test asset -			// fetch failures (should be replaced by new defaults in -			// lost&found). -			if (found.mWearableType == LLWearableType::WT_SHAPE || found.mWearableType == LLWearableType::WT_JACKET) +			if (skip_type != LLWearableType::WT_INVALID && skip_type == found.mWearableType)  			{  				found.mAssetID.generate(); // Replace with new UUID, guaranteed not to exist in DB -				  			} -#endif  			//pushing back, not front, to preserve order of wearables for LLAgentWearables -			holder->mFoundList.push_back(found); +			holder->getFoundList().push_back(found);  		}  		else  		{ @@ -1333,8 +1559,8 @@ void LLAppearanceMgr::updateAppearanceFromCOF()  		}  	} -	for (LLWearableHoldingPattern::found_list_t::iterator it = holder->mFoundList.begin(); -		 it != holder->mFoundList.end(); ++it) +	for (LLWearableHoldingPattern::found_list_t::iterator it = holder->getFoundList().begin(); +		 it != holder->getFoundList().end(); ++it)  	{  		LLFoundData& found = *it; @@ -1349,6 +1575,7 @@ void LLAppearanceMgr::updateAppearanceFromCOF()  	} +	holder->resetTime(gSavedSettings.getF32("MaxWearableWaitTime"));  	if (!holder->pollFetchCompletion())  	{  		doOnIdleRepeating(boost::bind(&LLWearableHoldingPattern::pollFetchCompletion,holder)); diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 27dcb9f1c7..116c4cafc2 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -203,19 +203,13 @@ void LLAssetUploadResponder::uploadComplete(const LLSD& content)  LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(const LLSD& post_data,  														   const LLUUID& vfile_id, -														   LLAssetType::EType asset_type, -														   boost::function<void(const LLUUID& uuid)> callback) -: LLAssetUploadResponder(post_data, vfile_id, asset_type), -  mCallback(callback) +														   LLAssetType::EType asset_type) +: LLAssetUploadResponder(post_data, vfile_id, asset_type)  {  } -LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(const LLSD& post_data,  -														   const std::string& file_name,  -														   LLAssetType::EType asset_type,  -														   boost::function<void(const LLUUID& uuid)> callback) -: LLAssetUploadResponder(post_data, file_name, asset_type), -  mCallback(callback) +LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(const LLSD& post_data, const std::string& file_name, LLAssetType::EType asset_type) +: LLAssetUploadResponder(post_data, file_name, asset_type)  {  } @@ -293,12 +287,6 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)  										creation_date_now);  		gInventory.updateItem(item);  		gInventory.notifyObservers(); -		 -		if (mCallback) -		{ -			// call the callback with the new Asset UUID -			mCallback(item->getAssetUUID()); -		}  		// Show the preview panel for textures and sounds to let  		// user know that the image (or snapshot) arrived intact. @@ -346,11 +334,13 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)  		U32 group_perms      = mPostData.has("group_mask")      ? mPostData.get("group_mask"     ).asInteger() : PERM_NONE;  		U32 next_owner_perms = mPostData.has("next_owner_mask") ? mPostData.get("next_owner_mask").asInteger() : PERM_NONE;  		std::string display_name = LLStringUtil::null; +		LLAssetStorage::LLStoreAssetCallback callback = NULL; +		void *userdata = NULL;  		upload_new_resource(next_file, asset_name, asset_name, -				    LLFolderType::FT_NONE, LLInventoryType::IT_NONE, +				    0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,  				    next_owner_perms, group_perms,  				    everyone_perms, display_name, -				    NULL, expected_upload_cost); +				    callback, expected_upload_cost, userdata);  	}  } diff --git a/indra/newview/llassetuploadresponders.h b/indra/newview/llassetuploadresponders.h index 2358aeb39d..91fb39916d 100644 --- a/indra/newview/llassetuploadresponders.h +++ b/indra/newview/llassetuploadresponders.h @@ -33,7 +33,6 @@  #ifndef LL_LLASSETUPLOADRESPONDER_H  #define LL_LLASSETUPLOADRESPONDER_H -#include "llassetstorage.h"  #include "llhttpclient.h"  // Abstract class for supporting asset upload @@ -67,15 +66,10 @@ class LLNewAgentInventoryResponder : public LLAssetUploadResponder  public:  	LLNewAgentInventoryResponder(const LLSD& post_data,  								const LLUUID& vfile_id, -								LLAssetType::EType asset_type, -								boost::function<void(const LLUUID& uuid)> callback = NULL); -	LLNewAgentInventoryResponder(const LLSD& post_data,  -								const std::string& file_name, -								 LLAssetType::EType asset_type, -								boost::function<void(const LLUUID& uuid)> callback = NULL); +								LLAssetType::EType asset_type); +	LLNewAgentInventoryResponder(const LLSD& post_data, const std::string& file_name, +											   LLAssetType::EType asset_type);  	virtual void uploadComplete(const LLSD& content); - -	boost::function<void(const LLUUID& uuid)> mCallback;  };  struct LLBakedUploadData; diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp index 043f753e01..f14e64e3e4 100644 --- a/indra/newview/llfloateranimpreview.cpp +++ b/indra/newview/llfloateranimpreview.cpp @@ -1001,18 +1001,19 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata)  			{  				std::string name = floaterp->childGetValue("name_form").asString();  				std::string desc = floaterp->childGetValue("description_form").asString(); +				LLAssetStorage::LLStoreAssetCallback callback = NULL;  				S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); +				void *userdata = NULL;  				upload_new_resource(floaterp->mTransactionID, // tid  						    LLAssetType::AT_ANIMATION,  						    name,  						    desc, +						    0,  						    LLFolderType::FT_NONE,  						    LLInventoryType::IT_ANIMATION, -						    LLFloaterPerms::getNextOwnerPerms(),  -							LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), +						    LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),  						    name, -						    NULL,  -							expected_upload_cost); +						    callback, expected_upload_cost, userdata);  			}  			else  			{ diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp index 5c343ecb22..159ce41b79 100644 --- a/indra/newview/llfloaternamedesc.cpp +++ b/indra/newview/llfloaternamedesc.cpp @@ -169,14 +169,16 @@ void LLFloaterNameDesc::onBtnOK( )  {  	childDisable("ok_btn"); // don't allow inadvertent extra uploads +	LLAssetStorage::LLStoreAssetCallback callback = NULL;  	S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); // kinda hack - assumes that unsubclassed LLFloaterNameDesc is only used for uploading chargeable assets, which it is right now (it's only used unsubclassed for the sound upload dialog, and THAT should be a subclass). +	void *nruserdata = NULL;  	std::string display_name = LLStringUtil::null;  	upload_new_resource(mFilenameAndPath, // file  			    childGetValue("name_form").asString(),   			    childGetValue("description_form").asString(),  -			    LLFolderType::FT_NONE, LLInventoryType::IT_NONE, +			    0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,  			    LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), -			    display_name, NULL, expected_upload_cost); +			    display_name, callback, expected_upload_cost, nruserdata);  	closeFloater(false);  } diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 129dd55e48..f3baa482a0 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -39,33 +39,28 @@  // Viewer includes  #include "llagent.h"  #include "llagentcamera.h" -#include "llagentui.h" -#include "llavatarpropertiesprocessor.h" -#include "llbottomtray.h" -#include "llbutton.h"  #include "llcallbacklist.h" -#include "llcheckboxctrl.h" -#include "llcombobox.h"  #include "llcriticaldamp.h" -#include "lleconomy.h" -#include "llfloaterpostcard.h" +#include "llui.h"  #include "llfocusmgr.h" -#include "lllandmarkactions.h" -#include "llradiogroup.h" +#include "llbutton.h" +#include "llcombobox.h" +#include "lleconomy.h"  #include "llsliderctrl.h" -#include "llslurl.h"  #include "llspinctrl.h" -#include "lltoolfocus.h" -#include "lltoolmgr.h" -#include "llui.h" -#include "lluictrlfactory.h" -#include "llviewercamera.h"  #include "llviewercontrol.h" -#include "llviewermenufile.h"	// upload_new_resource() +#include "lluictrlfactory.h"  #include "llviewerstats.h" +#include "llviewercamera.h"  #include "llviewerwindow.h" -#include "llweb.h" +#include "llviewermenufile.h"	// upload_new_resource() +#include "llfloaterpostcard.h" +#include "llcheckboxctrl.h" +#include "llradiogroup.h" +#include "lltoolfocus.h" +#include "lltoolmgr.h"  #include "llworld.h" +#include "llagentui.h"  // Linden library includes  #include "llfontgl.h" @@ -91,6 +86,10 @@  ///----------------------------------------------------------------------------  /// Local function declarations, constants, enums, and typedefs  ///---------------------------------------------------------------------------- +S32 LLFloaterSnapshot::sUIWinHeightLong = 526 ; +S32 LLFloaterSnapshot::sUIWinHeightShort = LLFloaterSnapshot::sUIWinHeightLong - 230 ; +S32 LLFloaterSnapshot::sUIWinWidth = 215 ; +  LLSnapshotFloaterView* gSnapshotFloaterView = NULL;  const F32 AUTO_SNAPSHOT_TIME_DELAY = 1.f; @@ -115,7 +114,6 @@ public:  	enum ESnapshotType  	{  		SNAPSHOT_POSTCARD, -		SNAPSHOT_WEB,  		SNAPSHOT_TEXTURE,  		SNAPSHOT_LOCAL  	}; @@ -164,9 +162,8 @@ public:  	void setSnapshotBufferType(LLViewerWindow::ESnapshotType type) { mSnapshotBufferType = type; }  	void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f);  	LLFloaterPostcard* savePostcard(); -	void saveTexture(bool set_as_profile_pic = false); +	void saveTexture();  	BOOL saveLocal(); -	void saveWeb(std::string url);  	BOOL setThumbnailImageSize() ;  	void generateThumbnailImage(BOOL force_update = FALSE) ; @@ -175,9 +172,6 @@ public:  	// Returns TRUE when snapshot generated, FALSE otherwise.  	static BOOL onIdle( void* snapshot_preview ); -	 -	// callback for region name resolve -	void regionNameCallback(std::string url, LLSD body, const std::string& name, S32 x, S32 y, S32 z);  private:  	LLColor4					mColor; @@ -299,7 +293,7 @@ F32 LLSnapshotLivePreview::getAspect()  	F32 image_aspect_ratio = ((F32)mWidth[mCurImageIndex]) / ((F32)mHeight[mCurImageIndex]);  	F32 window_aspect_ratio = ((F32)getRect().getWidth()) / ((F32)getRect().getHeight()); -	if (!mKeepAspectRatio) +	if (!mKeepAspectRatio)//gSavedSettings.getBOOL("KeepAspectForSnapshot"))  	{  		return image_aspect_ratio;  	} @@ -632,20 +626,20 @@ BOOL LLSnapshotLivePreview::setThumbnailImageSize()  	F32 window_aspect_ratio = ((F32)window_width) / ((F32)window_height);  	// UI size for thumbnail -	LLFloater* floater = LLFloaterReg::getInstance("snapshot"); -	mThumbnailWidth = floater->getChild<LLView>("thumbnail_placeholder")->getRect().getWidth(); -	mThumbnailHeight = floater->getChild<LLView>("thumbnail_placeholder")->getRect().getHeight(); +	S32 max_width = LLFloaterSnapshot::getUIWinWidth() - 20; +	S32 max_height = 90; - -	if (window_aspect_ratio > (F32)mThumbnailWidth / mThumbnailHeight) +	if (window_aspect_ratio > (F32)max_width / max_height)  	{  		// image too wide, shrink to width -		mThumbnailHeight = llround((F32)mThumbnailWidth / window_aspect_ratio); +		mThumbnailWidth = max_width; +		mThumbnailHeight = llround((F32)max_width / window_aspect_ratio);  	}  	else  	{  		// image too tall, shrink to height -		mThumbnailWidth = llround((F32)mThumbnailHeight * window_aspect_ratio); +		mThumbnailHeight = max_height; +		mThumbnailWidth = llround((F32)max_height * window_aspect_ratio);  	}  	if(mThumbnailWidth > window_width || mThumbnailHeight > window_height) @@ -831,21 +825,10 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )  		{  			// delete any existing image  			previewp->mFormattedImage = NULL; -  			// now create the new one of the appropriate format. -			// note: postcards and web hardcoded to use jpeg always. -			LLFloaterSnapshot::ESnapshotFormat format; -			 -			if (previewp->getSnapshotType() == SNAPSHOT_POSTCARD  ||  -				previewp->getSnapshotType() == SNAPSHOT_WEB) -			{ -				format = LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG; -			} -			else -			{ -				format = previewp->getSnapshotFormat(); -			} -            			 +			// note: postcards hardcoded to use jpeg always. +			LLFloaterSnapshot::ESnapshotFormat format = previewp->getSnapshotType() == SNAPSHOT_POSTCARD +				? LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG : previewp->getSnapshotFormat();  			switch(format)  			{  			case LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG: @@ -972,20 +955,13 @@ LLFloaterPostcard* LLSnapshotLivePreview::savePostcard()  	return floater;  } -// Callback for asset upload -void profile_pic_upload_callback(const LLUUID& uuid) -{ -	LLFloaterSnapshot* floater =  LLFloaterReg::getTypedInstance<LLFloaterSnapshot>("snapshot"); -	floater->setAsProfilePic(uuid); -} - -void LLSnapshotLivePreview::saveTexture(bool set_as_profile_pic) +void LLSnapshotLivePreview::saveTexture()  {  	// gen a new uuid for this asset  	LLTransactionID tid;  	tid.generate();  	LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); - +		  	LLPointer<LLImageJ2C> formatted = new LLImageJ2C;  	LLPointer<LLImageRaw> scaled = new LLImageRaw(mPreviewImage->getData(),  												  mPreviewImage->getWidth(), @@ -996,30 +972,26 @@ void LLSnapshotLivePreview::saveTexture(bool set_as_profile_pic)  	if (formatted->encode(scaled, 0.0f))  	{ -		boost::function<void(const LLUUID& uuid)> callback = NULL; - -		if (set_as_profile_pic) -		{ -			callback = profile_pic_upload_callback; -		} -  		LLVFile::writeFile(formatted->getData(), formatted->getDataSize(), gVFS, new_asset_id, LLAssetType::AT_TEXTURE);  		std::string pos_string;  		LLAgentUI::buildLocationString(pos_string, LLAgentUI::LOCATION_FORMAT_FULL);  		std::string who_took_it;  		LLAgentUI::buildFullname(who_took_it); +		LLAssetStorage::LLStoreAssetCallback callback = NULL;  		S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); +		void *userdata = NULL;  		upload_new_resource(tid,	// tid  				    LLAssetType::AT_TEXTURE,  				    "Snapshot : " + pos_string,  				    "Taken by " + who_took_it + " at " + pos_string, +				    0,  				    LLFolderType::FT_SNAPSHOT_CATEGORY,  				    LLInventoryType::IT_SNAPSHOT,  				    PERM_ALL,  // Note: Snapshots to inventory is a special case of content upload  				    PERM_NONE, // that ignores the user's premissions preferences and continues to  				    PERM_NONE, // always use these fairly permissive hard-coded initial perms. - MG  				    "Snapshot : " + pos_string, -				    callback, expected_upload_cost); +				    callback, expected_upload_cost, userdata);  		gViewerWindow->playSnapshotAnimAndSound();  	}  	else @@ -1049,81 +1021,6 @@ BOOL LLSnapshotLivePreview::saveLocal()  	return success;  } - -class LLSendWebResponder : public LLHTTPClient::Responder -{ -public: -	 -	virtual void error(U32 status, const std::string& reason) -	{ -		llwarns << status << ": " << reason << llendl; -		LLNotificationsUtil::add("ShareToWebFailed"); -	} -	 -	virtual void result(const LLSD& content) -	{ -		std::string response_url = content["response_url"].asString(); - -		if (!response_url.empty()) -		{ -			LLWeb::loadURLExternal(response_url); -		} -		else -		{ -			LLNotificationsUtil::add("ShareToWebFailed"); -		} -	} - -}; - -void LLSnapshotLivePreview::saveWeb(std::string url) -{ -	if (url.empty()) -	{ -		llwarns << "No share to web url" << llendl; -		return; -	} - -	LLImageJPEG* jpg = dynamic_cast<LLImageJPEG*>(mFormattedImage.get()); -	if(!jpg) -	{ -		llwarns << "Formatted image not a JPEG" << llendl; -		return; -	} -	 -/* figure out if there's a better way to serialize */ -	LLSD body; -	std::vector<U8> binary_image; -	U8* data = jpg->getData(); -	for (int i = 0; i < jpg->getDataSize(); i++) -	{ -		binary_image.push_back(data[i]); -	} -	 -	body["image"] = binary_image; - -	body["description"] = getChild<LLLineEditor>("description")->getText(); - -	std::string name; -	LLAgentUI::buildFullname(name); - -	body["avatar_name"] = name; -	 -	LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(gAgentCamera.getCameraPositionGlobal(), -		boost::bind(&LLSnapshotLivePreview::regionNameCallback, this, url, body, _1, _2, _3, _4)); -	 -	gViewerWindow->playSnapshotAnimAndSound(); -} - - -void LLSnapshotLivePreview::regionNameCallback(std::string url, LLSD body, const std::string& name, S32 x, S32 y, S32 z) -{ -	body["slurl"] = LLSLURL(name, LLVector3d(x, y, z)).getSLURLString(); - -	LLHTTPClient::post(url, body, -		new LLSendWebResponder()); -} -  ///----------------------------------------------------------------------------  /// Class LLFloaterSnapshot::Impl  ///---------------------------------------------------------------------------- @@ -1143,8 +1040,14 @@ public:  		mAvatarPauseHandles.clear();  	} +	static void onClickDiscard(void* data); +	static void onClickKeep(void* data); +	static void onCommitSave(LLUICtrl* ctrl, void* data);  	static void onClickNewSnapshot(void* data);  	static void onClickAutoSnap(LLUICtrl *ctrl, void* data); +	//static void onClickAdvanceSnap(LLUICtrl *ctrl, void* data); +	static void onClickLess(void* data) ; +	static void onClickMore(void* data) ;  	static void onClickUICheck(LLUICtrl *ctrl, void* data);  	static void onClickHUDCheck(LLUICtrl *ctrl, void* data);  	static void onClickKeepOpenCheck(LLUICtrl *ctrl, void* data); @@ -1154,14 +1057,9 @@ public:  	static void updateResolution(LLUICtrl* ctrl, void* data, BOOL do_update = TRUE);  	static void onCommitFreezeFrame(LLUICtrl* ctrl, void* data);  	static void onCommitLayerTypes(LLUICtrl* ctrl, void*data); +	static void onCommitSnapshotType(LLUICtrl* ctrl, void* data);  	static void onCommitSnapshotFormat(LLUICtrl* ctrl, void* data);  	static void onCommitCustomResolution(LLUICtrl *ctrl, void* data); -	static void onCommitSnapshot(LLFloaterSnapshot* view, LLSnapshotLivePreview::ESnapshotType type); -	static void confirmSavingTexture(LLFloaterSnapshot* view, bool set_as_profile_pic = false); -	static void onSavingTextureConfirmed(const LLSD& notification, const LLSD& response, LLFloaterSnapshot* view, bool set_as_profile_pic); -	static void checkCloseOnKeep(LLFloaterSnapshot* view); -	static void onCommitProfilePic(LLFloaterSnapshot* view); -	static void showAdvanced(LLFloaterSnapshot* view, const BOOL visible);  	static void resetSnapshotSizeOnUI(LLFloaterSnapshot *view, S32 width, S32 height) ;  	static BOOL checkImageSize(LLSnapshotLivePreview* previewp, S32& width, S32& height, BOOL isWidthChanged, S32 max_value); @@ -1169,8 +1067,10 @@ public:  	static void setResolution(LLFloaterSnapshot* floater, const std::string& comboname);  	static void updateControls(LLFloaterSnapshot* floater);  	static void updateLayout(LLFloaterSnapshot* floater); +	static void updateResolutionTextEntry(LLFloaterSnapshot* floater);  private: +	static LLSnapshotLivePreview::ESnapshotType getTypeIndex(LLFloaterSnapshot* floater);  	static ESnapshotFormat getFormatIndex(LLFloaterSnapshot* floater);  	static LLViewerWindow::ESnapshotType getLayerType(LLFloaterSnapshot* floater);  	static void comboSetCustom(LLFloaterSnapshot *floater, const std::string& comboname); @@ -1193,6 +1093,22 @@ LLSnapshotLivePreview* LLFloaterSnapshot::Impl::getPreviewView(LLFloaterSnapshot  }  // static +LLSnapshotLivePreview::ESnapshotType LLFloaterSnapshot::Impl::getTypeIndex(LLFloaterSnapshot* floater) +{ +	LLSnapshotLivePreview::ESnapshotType index = LLSnapshotLivePreview::SNAPSHOT_POSTCARD; +	LLSD value = floater->childGetValue("snapshot_type_radio"); +	const std::string id = value.asString(); +	if (id == "postcard") +		index = LLSnapshotLivePreview::SNAPSHOT_POSTCARD; +	else if (id == "texture") +		index = LLSnapshotLivePreview::SNAPSHOT_TEXTURE; +	else if (id == "local") +		index = LLSnapshotLivePreview::SNAPSHOT_LOCAL; +	return index; +} + + +// static  LLFloaterSnapshot::ESnapshotFormat LLFloaterSnapshot::Impl::getFormatIndex(LLFloaterSnapshot* floater)  {  	ESnapshotFormat index = SNAPSHOT_FORMAT_PNG; @@ -1240,12 +1156,20 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)  {  	LLSnapshotLivePreview* previewp = getPreviewView(floaterp); +	S32 delta_height = gSavedSettings.getBOOL("AdvanceSnapshot") ? 0 : floaterp->getUIWinHeightShort() - floaterp->getUIWinHeightLong() ; +  	if(!gSavedSettings.getBOOL("AdvanceSnapshot")) //set to original window resolution  	{  		previewp->mKeepAspectRatio = TRUE; -		floaterp->getChild<LLComboBox>("snapshot_size_combo")->setCurrentByIndex(0); -		gSavedSettings.setS32("SnapshotLastResolution", 0); +		floaterp->getChild<LLComboBox>("postcard_size_combo")->setCurrentByIndex(0); +		gSavedSettings.setS32("SnapshotPostcardLastResolution", 0); + +		floaterp->getChild<LLComboBox>("texture_size_combo")->setCurrentByIndex(0); +		gSavedSettings.setS32("SnapshotTextureLastResolution", 0); + +		floaterp->getChild<LLComboBox>("local_size_combo")->setCurrentByIndex(0); +		gSavedSettings.setS32("SnapshotLocalLastResolution", 0);  		LLSnapshotLivePreview* previewp = getPreviewView(floaterp);  		previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw()); @@ -1258,6 +1182,9 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)  		// stop all mouse events at fullscreen preview layer  		floaterp->getParent()->setMouseOpaque(TRUE); +		// shrink to smaller layout +		floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getUIWinHeightLong() + delta_height); +  		// can see and interact with fullscreen preview now  		if (previewp)  		{ @@ -1286,6 +1213,7 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)  	else // turning off freeze frame mode  	{  		floaterp->getParent()->setMouseOpaque(FALSE); +		floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getUIWinHeightLong() + delta_height);  		if (previewp)  		{  			previewp->setVisible(FALSE); @@ -1314,27 +1242,127 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp)  // static  void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)  { +	LLRadioGroup* snapshot_type_radio = floater->getChild<LLRadioGroup>("snapshot_type_radio"); +	snapshot_type_radio->setSelectedIndex(gSavedSettings.getS32("LastSnapshotType")); +	LLSnapshotLivePreview::ESnapshotType shot_type = getTypeIndex(floater); +	ESnapshotFormat shot_format = (ESnapshotFormat)gSavedSettings.getS32("SnapshotFormat"); //getFormatIndex(floater);	LLViewerWindow::ESnapshotType layer_type = getLayerType(floater); +	LLViewerWindow::ESnapshotType layer_type = getLayerType(floater); + +	floater->childSetVisible("postcard_size_combo", FALSE); +	floater->childSetVisible("texture_size_combo", FALSE); +	floater->childSetVisible("local_size_combo", FALSE); + +	floater->getChild<LLComboBox>("postcard_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotPostcardLastResolution")); +	floater->getChild<LLComboBox>("texture_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotTextureLastResolution")); +	floater->getChild<LLComboBox>("local_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotLocalLastResolution")); +	floater->getChild<LLComboBox>("local_format_combo")->selectNthItem(gSavedSettings.getS32("SnapshotFormat")); + +	floater->childSetVisible("upload_btn",			shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE); +	floater->childSetVisible("send_btn",			shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD); +	floater->childSetVisible("save_btn",			shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL); +	floater->childSetEnabled("keep_aspect_check",	shot_type != LLSnapshotLivePreview::SNAPSHOT_TEXTURE && !floater->impl.mAspectRatioCheckOff); +	floater->childSetEnabled("layer_types",			shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL); + +	BOOL is_advance = gSavedSettings.getBOOL("AdvanceSnapshot"); +	BOOL is_local = shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL; +	BOOL show_slider =  +		shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD +		|| (is_local && shot_format == LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG); + +	floater->childSetVisible("more_btn", !is_advance); // the only item hidden in advanced mode +	floater->childSetVisible("less_btn",				is_advance); +	floater->childSetVisible("type_label2",				is_advance); +	floater->childSetVisible("format_label",			is_advance && is_local); +	floater->childSetVisible("local_format_combo",		is_advance && is_local); +	floater->childSetVisible("layer_types",				is_advance); +	floater->childSetVisible("layer_type_label",		is_advance); +	floater->childSetVisible("snapshot_width",			is_advance); +	floater->childSetVisible("snapshot_height",			is_advance); +	floater->childSetVisible("keep_aspect_check",		is_advance); +	floater->childSetVisible("ui_check",				is_advance); +	floater->childSetVisible("hud_check",				is_advance); +	floater->childSetVisible("keep_open_check",			is_advance); +	floater->childSetVisible("freeze_frame_check",		is_advance); +	floater->childSetVisible("auto_snapshot_check",		is_advance); +	floater->childSetVisible("image_quality_slider",	is_advance && show_slider); +  	LLSnapshotLivePreview* previewp = getPreviewView(floater); -	if (NULL == previewp) -	{ -		return; +	BOOL got_bytes = previewp && previewp->getDataSize() > 0; +	BOOL got_snap = previewp && previewp->getSnapshotUpToDate(); + +	floater->childSetEnabled("send_btn",   shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD && got_snap && previewp->getDataSize() <= MAX_POSTCARD_DATASIZE); +	floater->childSetEnabled("upload_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE  && got_snap); +	floater->childSetEnabled("save_btn",   shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL    && got_snap); + +	LLLocale locale(LLLocale::USER_LOCALE); +	std::string bytes_string; +	if (got_snap) +	{ +		LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 ); +	} +	S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); +	floater->childSetLabelArg("texture", "[AMOUNT]", llformat("%d",upload_cost)); +	floater->childSetLabelArg("upload_btn", "[AMOUNT]", llformat("%d",upload_cost)); +	floater->childSetTextArg("file_size_label", "[SIZE]", got_snap ? bytes_string : floater->getString("unknown")); +	floater->childSetColor("file_size_label",  +		shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD  +		&& got_bytes +		&& previewp->getDataSize() > MAX_POSTCARD_DATASIZE ? LLUIColor(LLColor4::red) : LLUIColorTable::instance().getColor( "LabelTextColor" )); + +	switch(shot_type) +	{ +	  case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: +		layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR; +		floater->childSetValue("layer_types", "colors"); +		if(is_advance) +		{			 +			setResolution(floater, "postcard_size_combo"); +		} +		break; +	  case LLSnapshotLivePreview::SNAPSHOT_TEXTURE: +		layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR; +		floater->childSetValue("layer_types", "colors"); +		if(is_advance) +		{ +			setResolution(floater, "texture_size_combo");			 +		} +		break; +	  case  LLSnapshotLivePreview::SNAPSHOT_LOCAL: +		if(is_advance) +		{ +			setResolution(floater, "local_size_combo"); +		} +		break; +	  default: +		break;  	} -	// Disable buttons until Snapshot is ready. EXT-6534 -	BOOL got_snap = previewp->getSnapshotUpToDate(); +	updateResolutionTextEntry(floater); -	// process Main buttons -	floater->childSetEnabled("share", got_snap); -	floater->childSetEnabled("save", got_snap); -	floater->childSetEnabled("set_profile_pic", got_snap); +	if (previewp) +	{ +		previewp->setSnapshotType(shot_type); +		previewp->setSnapshotFormat(shot_format); +		previewp->setSnapshotBufferType(layer_type); +	} +} -	// process Share actions buttons -	floater->childSetEnabled("share_to_web", got_snap); -	floater->childSetEnabled("share_to_email", got_snap); +// static +void LLFloaterSnapshot::Impl::updateResolutionTextEntry(LLFloaterSnapshot* floater) +{ +	LLSpinCtrl* width_spinner = floater->getChild<LLSpinCtrl>("snapshot_width"); +	LLSpinCtrl* height_spinner = floater->getChild<LLSpinCtrl>("snapshot_height"); -	// process Save actions buttons -	floater->childSetEnabled("save_to_inventory", got_snap); -	floater->childSetEnabled("save_to_computer", got_snap); +	if(getTypeIndex(floater) == LLSnapshotLivePreview::SNAPSHOT_TEXTURE) +	{ +		width_spinner->setAllowEdit(FALSE); +		height_spinner->setAllowEdit(FALSE); +	} +	else +	{ +		width_spinner->setAllowEdit(TRUE); +		height_spinner->setAllowEdit(TRUE); +	}  }  // static @@ -1348,6 +1376,70 @@ void LLFloaterSnapshot::Impl::checkAutoSnapshot(LLSnapshotLivePreview* previewp,  }  // static +void LLFloaterSnapshot::Impl::onClickDiscard(void* data) +{ +	LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; +	 +	if (view) +	{ +		view->closeFloater(); +	} +} + + +// static +void LLFloaterSnapshot::Impl::onCommitSave(LLUICtrl* ctrl, void* data) +{ +	if (ctrl->getValue().asString() == "save as") +	{ +		gViewerWindow->resetSnapshotLoc(); +	} +	onClickKeep(data); +} + +// static +void LLFloaterSnapshot::Impl::onClickKeep(void* data) +{ +	LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; +	LLSnapshotLivePreview* previewp = getPreviewView(view); +	 +	if (previewp) +	{ +		if (previewp->getSnapshotType() == LLSnapshotLivePreview::SNAPSHOT_POSTCARD) +		{ +			LLFloaterPostcard* floater = previewp->savePostcard(); +			// if still in snapshot mode, put postcard floater in snapshot floaterview +			// and link it to snapshot floater +			if (floater && !gSavedSettings.getBOOL("CloseSnapshotOnKeep")) +			{ +				gFloaterView->removeChild(floater); +				gSnapshotFloaterView->addChild(floater); +				view->addDependentFloater(floater, FALSE); +			} +		} +		else if (previewp->getSnapshotType() == LLSnapshotLivePreview::SNAPSHOT_TEXTURE) +		{ +			previewp->saveTexture(); +		} +		else +		{ +			previewp->saveLocal(); +		} + +		if (gSavedSettings.getBOOL("CloseSnapshotOnKeep")) +		{ +			view->closeFloater(); +		} +		else +		{ +			checkAutoSnapshot(previewp); +		} + +		updateControls(view); +	} +} + +// static  void LLFloaterSnapshot::Impl::onClickNewSnapshot(void* data)  {  	LLSnapshotLivePreview* previewp = getPreviewView((LLFloaterSnapshot *)data); @@ -1372,6 +1464,41 @@ void LLFloaterSnapshot::Impl::onClickAutoSnap(LLUICtrl *ctrl, void* data)  	}  } +void LLFloaterSnapshot::Impl::onClickMore(void* data) +{ +	gSavedSettings.setBOOL( "AdvanceSnapshot", TRUE ); +	 +	LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;		 +	if (view) +	{ +		view->translate( 0, view->getUIWinHeightShort() - view->getUIWinHeightLong() ); +		view->reshape(view->getRect().getWidth(), view->getUIWinHeightLong()); +		updateControls(view) ; +		updateLayout(view) ; +		if(getPreviewView(view)) +		{ +			getPreviewView(view)->setThumbnailImageSize() ; +		} +	} +} +void LLFloaterSnapshot::Impl::onClickLess(void* data) +{ +	gSavedSettings.setBOOL( "AdvanceSnapshot", FALSE ); +	 +	LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;		 +	if (view) +	{ +		view->translate( 0, view->getUIWinHeightLong() - view->getUIWinHeightShort() ); +		view->reshape(view->getRect().getWidth(), view->getUIWinHeightShort()); +		updateControls(view) ; +		updateLayout(view) ; +		if(getPreviewView(view)) +		{ +			getPreviewView(view)->setThumbnailImageSize() ; +		} +	} +} +  // static  void LLFloaterSnapshot::Impl::onClickUICheck(LLUICtrl *ctrl, void* data)  { @@ -1548,8 +1675,10 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL  	}  	// save off all selected resolution values -	gSavedSettings.setS32("SnapshotLastResolution", view->getChild<LLComboBox>("snapshot_size_combo")->getCurrentIndex()); -	 +	gSavedSettings.setS32("SnapshotPostcardLastResolution", view->getChild<LLComboBox>("postcard_size_combo")->getCurrentIndex()); +	gSavedSettings.setS32("SnapshotTextureLastResolution",  view->getChild<LLComboBox>("texture_size_combo")->getCurrentIndex()); +	gSavedSettings.setS32("SnapshotLocalLastResolution",    view->getChild<LLComboBox>("local_size_combo")->getCurrentIndex()); +  	std::string sdstring = combobox->getSelectedValue();  	LLSD sdres;  	std::stringstream sstream(sdstring); @@ -1629,149 +1758,17 @@ void LLFloaterSnapshot::Impl::onCommitLayerTypes(LLUICtrl* ctrl, void*data)  }  //static  -void LLFloaterSnapshot::Impl::showAdvanced(LLFloaterSnapshot* view, const BOOL visible) -{ -	LLPanel* advanced_panel = view->getChild<LLPanel>("snapshot_advanced"); - -	if (advanced_panel->getVisible() != visible) -	{ -		gSavedSettings.setBOOL("AdvanceSnapshot", visible); - -		advanced_panel->setVisible(visible); -		view->getChild<LLButton>("hide_advanced")->setVisible(visible); -		view->getChild<LLButton>("show_advanced")->setVisible(!visible); - -		if (visible) -		{ -			// stretch the floater so it can accommodate the advanced panel -			view->reshape(view->getRect().getWidth() + advanced_panel->getRect().getWidth(), view->getRect().getHeight()); -		} -		else -		{ -			// shrink floater back to original size -			view->reshape(view->getRect().getWidth() - advanced_panel->getRect().getWidth(), view->getRect().getHeight()); -		} -	} -} - -// This object represents a pending request for avatar properties information -class LLAvatarDataRequest : public LLAvatarPropertiesObserver -{ -public: -	LLAvatarDataRequest(const LLUUID& avatar_id, const LLUUID& image_id, LLFloaterSnapshot* floater) -	:	mAvatarID(avatar_id), -		mImageID(image_id), -		mSnapshotFloater(floater) - -	{ -	} -	 -	~LLAvatarDataRequest() -	{ -		// remove ourselves as an observer -		LLAvatarPropertiesProcessor::getInstance()-> -		removeObserver(mAvatarID, this); -	} -	 -	void processProperties(void* data, EAvatarProcessorType type) -	{ -		// route the data to the inspector -		if (data -			&& type == APT_PROPERTIES) -		{ - -			LLAvatarData* avatar_data = static_cast<LLAvatarData*>(data); - -			LLAvatarData new_data(*avatar_data); -			new_data.image_id = mImageID; - -			LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate(&new_data); - -			delete this; -		} -	} -	 -	// Store avatar ID so we can un-register the observer on destruction -	LLUUID mAvatarID; -	LLUUID mImageID; -	LLFloaterSnapshot* mSnapshotFloater; -}; - -void LLFloaterSnapshot::Impl::onCommitProfilePic(LLFloaterSnapshot* view) -{ -	confirmSavingTexture(view, true); -} - -void LLFloaterSnapshot::Impl::onCommitSnapshot(LLFloaterSnapshot* view, LLSnapshotLivePreview::ESnapshotType type) -{ -	LLSnapshotLivePreview* previewp = getPreviewView(view); -	 -	if (previewp) -	{ -		previewp->setSnapshotType(type); - -		if (type == LLSnapshotLivePreview::SNAPSHOT_WEB) -		{ -			previewp->saveWeb(view->getString("share_to_web_url")); -			checkCloseOnKeep(view); -		} -		else if (type == LLSnapshotLivePreview::SNAPSHOT_LOCAL) -		{ -			previewp->saveLocal(); -			checkCloseOnKeep(view); -		} -		else if (type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE) -		{ -			// uploads and then calls checkCloseOnKeep() on confirmation from user -			confirmSavingTexture(view); -		} -		else if (type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD) -		{ -			LLFloaterPostcard* floater = previewp->savePostcard(); -			// if still in snapshot mode, put postcard floater in snapshot floaterview -			// and link it to snapshot floater -			if (floater && !gSavedSettings.getBOOL("CloseSnapshotOnKeep")) -			{ -				gFloaterView->removeChild(floater); -				gSnapshotFloaterView->addChild(floater); -				view->addDependentFloater(floater, FALSE); -			} -			checkCloseOnKeep(view); -		} -	} -} - -void LLFloaterSnapshot::Impl::confirmSavingTexture(LLFloaterSnapshot* view, bool set_as_profile_pic) -{ -	LLSD args; -	args["AMOUNT"] = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); -	LLNotificationsUtil::add("UploadConfirmation", args, LLSD(), -							 boost::bind(&onSavingTextureConfirmed, _1, _2, view, set_as_profile_pic)); -} - -void LLFloaterSnapshot::Impl::onSavingTextureConfirmed(const LLSD& notification, const LLSD& response, LLFloaterSnapshot* view, bool set_as_profile_pic) +void LLFloaterSnapshot::Impl::onCommitSnapshotType(LLUICtrl* ctrl, void* data)  { -	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - -	if (option == 0) +	LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;		 +	if (view)  	{ -		LLSnapshotLivePreview* previewp = getPreviewView(view); -		previewp->saveTexture(set_as_profile_pic); -		checkCloseOnKeep(view); +		gSavedSettings.setS32("LastSnapshotType", getTypeIndex(view)); +		getPreviewView(view)->updateSnapshot(TRUE); +		updateControls(view);  	}  } -void LLFloaterSnapshot::Impl::checkCloseOnKeep(LLFloaterSnapshot* view) -{ -	if (gSavedSettings.getBOOL("CloseSnapshotOnKeep")) -	{ -		view->closeFloater(); -	} -	else -	{ -		checkAutoSnapshot(getPreviewView(view)); -	} -}  //static   void LLFloaterSnapshot::Impl::onCommitSnapshotFormat(LLUICtrl* ctrl, void* data) @@ -1785,6 +1782,8 @@ void LLFloaterSnapshot::Impl::onCommitSnapshotFormat(LLUICtrl* ctrl, void* data)  	}  } + +  // Sets the named size combo to "custom" mode.  // static  void LLFloaterSnapshot::Impl::comboSetCustom(LLFloaterSnapshot* floater, const std::string& comboname) @@ -1793,11 +1792,24 @@ void LLFloaterSnapshot::Impl::comboSetCustom(LLFloaterSnapshot* floater, const s  	combo->setCurrentByIndex(combo->getItemCount() - 1); // "custom" is always the last index -	gSavedSettings.setS32("SnapshotLastResolution", combo->getCurrentIndex()); +	if(comboname == "postcard_size_combo")  +	{ +		gSavedSettings.setS32("SnapshotPostcardLastResolution", combo->getCurrentIndex()); +	} +	else if(comboname == "texture_size_combo")  +	{ +		gSavedSettings.setS32("SnapshotTextureLastResolution", combo->getCurrentIndex()); +	} +	else if(comboname == "local_size_combo")  +	{ +		gSavedSettings.setS32("SnapshotLocalLastResolution", combo->getCurrentIndex()); +	}  	checkAspectRatio(floater, -1); // -1 means custom  } + +  //static  BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S32& width, S32& height, BOOL isWidthChanged, S32 max_value)  { @@ -1938,7 +1950,9 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat  				previewp->setSize(w,h);  				checkAutoSnapshot(previewp, FALSE);  				previewp->updateSnapshot(FALSE, TRUE); -				comboSetCustom(view, "snapshot_size_combo"); +				comboSetCustom(view, "postcard_size_combo"); +				comboSetCustom(view, "texture_size_combo"); +				comboSetCustom(view, "local_size_combo");  			}  		} @@ -1955,15 +1969,10 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat  // Default constructor  LLFloaterSnapshot::LLFloaterSnapshot(const LLSD& key) -	: LLTransientDockableFloater(NULL, true, key), +	: LLFloater(key),  	  impl (*(new Impl))  {  	//Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_snapshot.xml", FALSE); - -	mCommitCallbackRegistrar.add("Snapshot.ShowButtons",  boost::bind(&LLFloaterSnapshot::updateButtons, this, _2)); -	mCommitCallbackRegistrar.add("Snapshot.ShowAdvanced", boost::bind(&Impl::showAdvanced, this, true)); -	mCommitCallbackRegistrar.add("Snapshot.HideAdvanced", boost::bind(&Impl::showAdvanced, this, false)); -	mCommitCallbackRegistrar.add("Snapshot.Refresh", boost::bind(&Impl::onClickNewSnapshot, this));  }  // Destroys the object @@ -1985,14 +1994,19 @@ LLFloaterSnapshot::~LLFloaterSnapshot()  BOOL LLFloaterSnapshot::postBuild()  { -	getChild<LLButton>("share_to_web")->setCommitCallback(boost::bind(&Impl::onCommitSnapshot, this, LLSnapshotLivePreview::SNAPSHOT_WEB)); -	getChild<LLButton>("share_to_email")->setCommitCallback(boost::bind(&Impl::onCommitSnapshot, this, LLSnapshotLivePreview::SNAPSHOT_POSTCARD)); -	getChild<LLButton>("save_to_inventory")->setCommitCallback(boost::bind(&Impl::onCommitSnapshot, this, LLSnapshotLivePreview::SNAPSHOT_TEXTURE)); -	getChild<LLButton>("save_to_computer")->setCommitCallback(boost::bind(&Impl::onCommitSnapshot, this, LLSnapshotLivePreview::SNAPSHOT_LOCAL)); -	getChild<LLButton>("set_profile_pic")->setCommitCallback(boost::bind(&Impl::onCommitProfilePic, this)); - +	childSetCommitCallback("snapshot_type_radio", Impl::onCommitSnapshotType, this);  	childSetCommitCallback("local_format_combo", Impl::onCommitSnapshotFormat, this); +	childSetAction("new_snapshot_btn", Impl::onClickNewSnapshot, this); + +	childSetAction("more_btn", Impl::onClickMore, this); +	childSetAction("less_btn", Impl::onClickLess, this); + +	childSetAction("upload_btn", Impl::onClickKeep, this); +	childSetAction("send_btn", Impl::onClickKeep, this); +	childSetCommitCallback("save_btn", Impl::onCommitSave, this); +	childSetAction("discard_btn", Impl::onClickDiscard, this); +  	childSetCommitCallback("image_quality_slider", Impl::onCommitQuality, this);  	childSetValue("image_quality_slider", gSavedSettings.getS32("SnapshotQuality")); @@ -2013,6 +2027,7 @@ BOOL LLFloaterSnapshot::postBuild()  	childSetCommitCallback("layer_types", Impl::onCommitLayerTypes, this);  	childSetValue("layer_types", "colors"); +	childSetEnabled("layer_types", FALSE);  	childSetValue("snapshot_width", gSavedSettings.getS32(lastSnapshotWidthName()));  	childSetValue("snapshot_height", gSavedSettings.getS32(lastSnapshotHeightName())); @@ -2023,7 +2038,9 @@ BOOL LLFloaterSnapshot::postBuild()  	childSetValue("auto_snapshot_check", gSavedSettings.getBOOL("AutoSnapshot"));  	childSetCommitCallback("auto_snapshot_check", Impl::onClickAutoSnap, this); -	childSetCommitCallback("snapshot_size_combo", Impl::onCommitResolution, this); +	childSetCommitCallback("postcard_size_combo", Impl::onCommitResolution, this); +	childSetCommitCallback("texture_size_combo", Impl::onCommitResolution, this); +	childSetCommitCallback("local_size_combo", Impl::onCommitResolution, this);  	// create preview window  	LLRect full_screen_rect = getRootView()->getRect(); @@ -2044,15 +2061,8 @@ BOOL LLFloaterSnapshot::postBuild()  	impl.mPreviewHandle = previewp->getHandle();  	impl.updateControls(this);  	impl.updateLayout(this); -	impl.showAdvanced(this, gSavedSettings.getBOOL("AdvanceSnapshot")); - -	//save off the refresh button's rectangle so we can apply offsets with thumbnail resize  -	mRefreshBtnRect = getChild<LLButton>("new_snapshot_btn")->getRect(); - -	// make sure we share/hide the general buttons  -	updateButtons(LLSD("main")); -	return LLDockableFloater::postBuild(); +	return TRUE;  }  void LLFloaterSnapshot::draw() @@ -2065,19 +2075,15 @@ void LLFloaterSnapshot::draw()  		return;  	} -	LLDockableFloater::draw(); - -	LLButton* refresh_btn = getChild<LLButton>("new_snapshot_btn"); -	// revert the refresh button to original intended position -	LLRect refresh_rect = mRefreshBtnRect; +	LLFloater::draw();  	if (previewp)  	{		  		if(previewp->getThumbnailImage())  		{ -			LLRect thumbnail_rect = getChild<LLView>("thumbnail_placeholder")->getRect(); +			LLRect thumbnail_rect = getChild<LLUICtrl>("thumbnail_placeholder")->getRect(); -			S32 offset_x = (thumbnail_rect.getWidth() - previewp->getThumbnailWidth()) / 2 + thumbnail_rect.mLeft; +			S32 offset_x = (getRect().getWidth() - previewp->getThumbnailWidth()) / 2 ;  			S32 offset_y = thumbnail_rect.mBottom + (thumbnail_rect.getHeight() - previewp->getThumbnailHeight()) / 2 ;  			glMatrixMode(GL_MODELVIEW); @@ -2086,14 +2092,8 @@ void LLFloaterSnapshot::draw()  					previewp->getThumbnailImage(), LLColor4::white);	  			previewp->drawPreviewRect(offset_x, offset_y) ; - -			refresh_rect.translate(offset_x - thumbnail_rect.mLeft, offset_y - thumbnail_rect.mBottom);  		}  	} - -	refresh_btn->setRect(refresh_rect); -	drawChild(refresh_btn); -	  }  void LLFloaterSnapshot::onOpen(const LLSD& key) @@ -2107,12 +2107,6 @@ void LLFloaterSnapshot::onOpen(const LLSD& key)  	gSnapshotFloaterView->setEnabled(TRUE);  	gSnapshotFloaterView->setVisible(TRUE);  	gSnapshotFloaterView->adjustToFitScreen(this, FALSE); - -	LLButton *snapshots = LLBottomTray::getInstance()->getChild<LLButton>("snapshots"); - -	setDockControl(new LLDockControl( -		snapshots, this, -		getDockTongue(), LLDockControl::TOP));  }  void LLFloaterSnapshot::onClose(bool app_quitting) @@ -2140,34 +2134,6 @@ void LLFloaterSnapshot::update()  	}  } -bool LLFloaterSnapshot::updateButtons(const LLSD& mode) -{ -	std::string button_mode = mode.asString(); - -	bool mode_main("main" == button_mode); -	bool mode_share("share" == button_mode); -	bool mode_save("save" == button_mode); - -	// Default to a known state if mode is invalid. -	if (!mode_main && !mode_share && !mode_save) mode_main = true; - -	childSetVisible("panel_snapshot_main", mode_main); -	childSetVisible("panel_snapshot_share", mode_share); -	childSetVisible("panel_snapshot_save", mode_save); - -	return true; -} - -void LLFloaterSnapshot::setAsProfilePic(const LLUUID& image_id) -{ -	LLAvatarDataRequest* avatar_data_request = new LLAvatarDataRequest(gAgent.getID(), image_id, this); -	 -	LLAvatarPropertiesProcessor* processor =  -		LLAvatarPropertiesProcessor::getInstance(); -	 -	processor->addObserver(gAgent.getID(), avatar_data_request); -	processor->sendAvatarPropertiesRequest(gAgent.getID()); -}  ///----------------------------------------------------------------------------  /// Class LLSnapshotFloaterView diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h index 8c4373c35c..1333497bd2 100644 --- a/indra/newview/llfloatersnapshot.h +++ b/indra/newview/llfloatersnapshot.h @@ -34,10 +34,9 @@  #define LL_LLFLOATERSNAPSHOT_H  #include "llfloater.h" -#include "lltransientdockablefloater.h" -class LLFloaterSnapshot : public LLTransientDockableFloater +class LLFloaterSnapshot : public LLFloater  {  public:  	typedef enum e_snapshot_format @@ -57,10 +56,6 @@ public:  	static void update(); -	void setAsProfilePic(const LLUUID& image_id); -	 -	bool updateButtons(const LLSD& mode); -	  	static S32  getUIWinHeightLong()  {return sUIWinHeightLong ;}  	static S32  getUIWinHeightShort() {return sUIWinHeightShort ;}  	static S32  getUIWinWidth()       {return sUIWinWidth ;} @@ -72,8 +67,6 @@ private:  	static S32    sUIWinHeightLong ;  	static S32    sUIWinHeightShort ;  	static S32    sUIWinWidth ; - -	LLRect mRefreshBtnRect;  };  class LLSnapshotFloaterView : public LLFloaterView diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 74034cfbf7..f241d18a21 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -185,6 +185,7 @@ LLFolderView::LLFolderView(const Params& p)  	mRenameItem( NULL ),  	mNeedsScroll( FALSE ),  	mEnableScroll( true ), +	mUseLabelSuffix(p.use_label_suffix),  	mPinningSelectedItem(FALSE),  	mNeedsAutoSelect( FALSE ),  	mAutoSelectOverride(FALSE), @@ -961,7 +962,7 @@ void LLFolderView::draw()  		}  		mStatusTextBox->setValue(mStatusText);  		mStatusTextBox->setVisible( TRUE ); - +		  		// firstly reshape message textbox with current size. This is necessary to  		// LLTextBox::getTextPixelHeight works properly  		const LLRect local_rect = getLocalRect(); diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 0dfdbd364b..55eb543f5f 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -96,6 +96,7 @@ public:  		Mandatory<LLPanel*>	    parent_panel;  		Optional<LLUUID>        task_id;  		Optional<std::string>   title; +		Optional<bool>			use_label_suffix;  	};  	LLFolderView(const Params&);  	virtual ~LLFolderView( void ); @@ -273,6 +274,7 @@ public:  	virtual S32	notify(const LLSD& info) ;  	void setEnableScroll(bool enable_scroll) { mEnableScroll = enable_scroll; } +	bool useLabelSuffix() { return mUseLabelSuffix; }  private:  	void updateRenamerPosition(); @@ -309,6 +311,7 @@ protected:  	BOOL							mNeedsAutoSelect;  	BOOL							mAutoSelectOverride;  	BOOL							mNeedsAutoRename; +	bool							mUseLabelSuffix;  	BOOL							mDebugFilters;  	U32								mSortOrder; diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 0c437cf035..50b35bfc69 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -289,8 +289,11 @@ void LLFolderViewItem::refreshFromListener()  			mCreationDate = mListener->getCreationDate();  			dirtyFilter();  		} -		mLabelStyle = mListener->getLabelStyle(); -		mLabelSuffix = mListener->getLabelSuffix(); +		if (mRoot->useLabelSuffix()) +		{ +			mLabelStyle = mListener->getLabelStyle(); +			mLabelSuffix = mListener->getLabelSuffix(); +		}  	}  } diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 7ce96a6ac1..413f329ce9 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2581,9 +2581,9 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  			mItems.push_back(std::string("New Clothes"));  			mItems.push_back(std::string("New Body Parts")); -			// Changing folder types is just a debug feature; this is fairly unsupported +#if SUPPORT_ENSEMBLES +			// Changing folder types is an unfinished unsupported feature  			// and can lead to unexpected behavior if enabled. -#if !LL_RELEASE_FOR_DOWNLOAD  			mItems.push_back(std::string("Change Type"));  			const LLViewerInventoryCategory *cat = getCategory();  			if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType())) diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 15760bf155..7c54dbcf74 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1262,12 +1262,6 @@ void LLInventoryModel::addCategory(LLViewerInventoryCategory* category)  void LLInventoryModel::addItem(LLViewerInventoryItem* item)  { -	/* -	const LLViewerInventoryCategory* cat = gInventory.getCategory(item->getParentUUID()); // Seraph remove for 2.1 -	const std::string cat_name = cat ? cat->getName() : "CAT NOT FOUND"; // Seraph remove for 2.1 -	llinfos << "Added item [ name:" << item->getName() << " UUID:" << item->getUUID() << " type:" << item->getActualType() << " ] to folder [ name:" << cat_name << " uuid:" << item->getParentUUID() << " ]" << llendl; // Seraph remove for 2.1 -	*/ -  	llassert(item);  	if(item)  	{ diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 83c57d5bb2..72d35af3b7 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -110,7 +110,7 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :  	}  } -BOOL LLInventoryPanel::postBuild() +void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)  {  	LLMemType mt(LLMemType::MTYPE_INVENTORY_POST_BUILD); @@ -128,6 +128,7 @@ BOOL LLInventoryPanel::postBuild()  		p.rect = folder_rect;  		p.parent_panel = this;  		p.tool_tip = p.name; +		p.use_label_suffix = params.use_label_suffix;  		mFolderRoot = LLUICtrlFactory::create<LLFolderView>(p);  		mFolderRoot->setAllowMultiSelect(mAllowMultiSelect);  	} @@ -174,8 +175,6 @@ BOOL LLInventoryPanel::postBuild()  		setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER));  	}  	mFolderRoot->setSortOrder(getFilter()->getSortOrder()); - -	return TRUE;  }  LLInventoryPanel::~LLInventoryPanel() @@ -782,7 +781,6 @@ void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& it  			fv->startRenamingSelectedItem();  		}  	} -	// Seraph - Put determineFolderType in here for ensemble typing?  }  void LLInventoryPanel::doToSelected(const LLSD& userdata) diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index 52e9ef799e..84603e8b4f 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -87,6 +87,7 @@ public:  		Optional<bool>						show_item_link_overlays;  		Optional<Filter>					filter;  		Optional<std::string>               start_folder; +		Optional<bool>						use_label_suffix;  		Params()  		:	sort_order_setting("sort_order_setting"), @@ -94,7 +95,8 @@ public:  			allow_multi_select("allow_multi_select", true),  			show_item_link_overlays("show_item_link_overlays", false),  			filter("filter"), -			start_folder("start_folder") +			start_folder("start_folder"), +			use_label_suffix("use_label_suffix", true)  		{}  	}; @@ -103,6 +105,7 @@ public:  	//--------------------------------------------------------------------  protected:  	LLInventoryPanel(const Params&); +	void initFromParams(const Params&);  	friend class LLUICtrlFactory;  public:  	virtual ~LLInventoryPanel(); @@ -110,8 +113,6 @@ public:  public:  	LLInventoryModel* getModel() { return mInventory; } -	BOOL postBuild(); -  	// LLView methods  	void draw();  	BOOL handleHover(S32 x, S32 y, MASK mask); diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 03df2d2b20..de074d6aaf 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -278,9 +278,6 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)  		tab->setRightMouseDownCallback(boost::bind(&LLOutfitsList::onAccordionTabRightClick, this,  			_1, _2, _3, cat_id)); -		tab->setDoubleClickCallback(boost::bind(&LLOutfitsList::onAccordionTabDoubleClick, this, -			_1, _2, _3, cat_id)); -  		// Setting tab focus callback to monitor currently selected outfit.  		tab->setFocusReceivedCallback(boost::bind(&LLOutfitsList::changeOutfitSelection, this, list, cat_id)); @@ -632,18 +629,6 @@ void LLOutfitsList::onAccordionTabRightClick(LLUICtrl* ctrl, S32 x, S32 y, const  	}  } -void LLOutfitsList::onAccordionTabDoubleClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id) -{ -	LLAccordionCtrlTab* tab = dynamic_cast<LLAccordionCtrlTab*>(ctrl); -	if(is_tab_header_clicked(tab, y) && cat_id.notNull()) -	{ -		LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); -		if (!cat) return; - -		LLAppearanceMgr::instance().wearInventoryCategory( cat, FALSE, FALSE ); -	} -} -  void LLOutfitsList::onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y)  {  	LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(ctrl); diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h index 478eaa50b3..5605044f41 100644 --- a/indra/newview/lloutfitslist.h +++ b/indra/newview/lloutfitslist.h @@ -131,7 +131,6 @@ private:  	void applyFilter(const std::string& new_filter_substring);  	void onAccordionTabRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id); -	void onAccordionTabDoubleClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id);  	void onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y);  	void onCOFChanged(); diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 54d1b46016..9eece81861 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -604,7 +604,7 @@ void LLPanelMainInventory::toggleFindOptions()  		finder->openFloater();  		LLFloater* parent_floater = gFloaterView->getParentFloater(this); -		if (parent_floater) // Seraph: Fix this, shouldn't be null even for sidepanel +		if (parent_floater)  			parent_floater->addDependentFloater(mFinderHandle);  		// start background fetch of folders  		LLInventoryModelBackgroundFetch::instance().start(); diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index ac419d8dc7..8c8fbdc88c 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -371,8 +371,7 @@ void LLStatusBar::refresh()  void LLStatusBar::setVisibleForMouselook(bool visible)  {  	mTextTime->setVisible(visible); -	getChild<LLUICtrl>("buycurrency")->setVisible(visible); -	getChild<LLUICtrl>("buyL")->setVisible(visible); +	getChild<LLUICtrl>("balance_bg")->setVisible(visible);  	mBtnVolume->setVisible(visible);  	mMediaToggle->setVisible(visible);  	mSGBandwidth->setVisible(visible); diff --git a/indra/newview/lltexglobalcolor.cpp b/indra/newview/lltexglobalcolor.cpp index d7840fb435..347f8bf627 100644 --- a/indra/newview/lltexglobalcolor.cpp +++ b/indra/newview/lltexglobalcolor.cpp @@ -1,6 +1,6 @@  /**    * @file lltexlayerglobalcolor.cpp - * @brief SERAPH - ADD IN + * @brief Color for texture layers.   *   * $LicenseInfo:firstyear=2008&license=viewergpl$   *  diff --git a/indra/newview/lltexlayerparams.cpp b/indra/newview/lltexlayerparams.cpp index 35acf883c7..f2d1b5d032 100644 --- a/indra/newview/lltexlayerparams.cpp +++ b/indra/newview/lltexlayerparams.cpp @@ -1,6 +1,6 @@  /**    * @file lltexlayerparams.cpp - * @brief SERAPH - ADD IN + * @brief Texture layer parameters   *   * $LicenseInfo:firstyear=2002&license=viewergpl$   *  diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp index 56b5d7467c..3105a6ec43 100644 --- a/indra/newview/llviewerfoldertype.cpp +++ b/indra/newview/llviewerfoldertype.cpp @@ -110,8 +110,6 @@ protected:  LLViewerFolderDictionary::LLViewerFolderDictionary()  { -	initEnsemblesFromFile(); -  	//       													    	  NEW CATEGORY NAME         FOLDER OPEN             FOLDER CLOSED          QUIET?  	//      												  		     |-------------------------|-----------------------|----------------------|-----------|  	addEntry(LLFolderType::FT_TEXTURE, 				new ViewerFolderEntry("Textures",				"Inv_SysOpen",			"Inv_SysClosed",		FALSE)); @@ -137,6 +135,15 @@ LLViewerFolderDictionary::LLViewerFolderDictionary()  	addEntry(LLFolderType::FT_INBOX, 				new ViewerFolderEntry("Inbox",					"Inv_SysOpen",			"Inv_SysClosed",		FALSE));  	addEntry(LLFolderType::FT_NONE, 				new ViewerFolderEntry("New Folder",				"Inv_FolderOpen",		"Inv_FolderClosed",		FALSE, "default")); + +#if SUPPORT_ENSEMBLES +	initEnsemblesFromFile(); +#else +	for (U32 type = (U32)LLFolderType::FT_ENSEMBLE_START; type <= (U32)LLFolderType::FT_ENSEMBLE_END; ++type) +	{ +		addEntry((LLFolderType::EType)type, 		new ViewerFolderEntry("New Folder",				"Inv_FolderOpen",		"Inv_FolderClosed",		FALSE)); +	}	 +#endif  }  bool LLViewerFolderDictionary::initEnsemblesFromFile() @@ -231,6 +238,15 @@ const std::string &LLViewerFolderType::lookupIconName(LLFolderType::EType folder  		else  			return entry->mIconNameClosed;  	} +	 +	// Error condition.  Return something so that we don't show a grey box in inventory view. +	const ViewerFolderEntry *default_entry = LLViewerFolderDictionary::getInstance()->lookup(LLFolderType::FT_NONE); +	if (default_entry) +	{ +		return default_entry->mIconNameClosed; +	} +	 +	// Should not get here unless there's something corrupted with the FT_NONE entry.  	return badLookup();  } diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 14e58f4167..d7190f26a3 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -1776,29 +1776,22 @@ void LLViewerMediaImpl::loadURI()  		llinfos << "Asking media source to load URI: " << uri << llendl;  		mMediaSource->loadURI( uri ); - +		 +		// A non-zero mPreviousMediaTime means that either this media was previously unloaded by the priority code while playing/paused,  +		// or a seek happened before the media loaded.  In either case, seek to the saved time. +		if(mPreviousMediaTime != 0.0f) +		{ +			seek(mPreviousMediaTime); +		} +			  		if(mPreviousMediaState == MEDIA_PLAYING)  		{  			// This media was playing before this instance was unloaded. - -			if(mPreviousMediaTime != 0.0f) -			{ -				// Seek back to where we left off, if possible. -				seek(mPreviousMediaTime); -			} -			  			start();  		}  		else if(mPreviousMediaState == MEDIA_PAUSED)  		{  			// This media was paused before this instance was unloaded. - -			if(mPreviousMediaTime != 0.0f) -			{ -				// Seek back to where we left off, if possible. -				seek(mPreviousMediaTime); -			} -			  			pause();  		}  		else @@ -1857,6 +1850,10 @@ void LLViewerMediaImpl::pause()  	{  		mMediaSource->pause();  	} +	else +	{ +		mPreviousMediaState = MEDIA_PAUSED; +	}  }  ////////////////////////////////////////////////////////////////////////////////////////// @@ -1866,6 +1863,10 @@ void LLViewerMediaImpl::start()  	{  		mMediaSource->start();  	} +	else +	{ +		mPreviousMediaState = MEDIA_PLAYING; +	}  }  ////////////////////////////////////////////////////////////////////////////////////////// @@ -1875,6 +1876,11 @@ void LLViewerMediaImpl::seek(F32 time)  	{  		mMediaSource->seek(time);  	} +	else +	{ +		// Save the seek time to be set when the media is loaded. +		mPreviousMediaTime = time; +	}  }  ////////////////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 5570fe5fec..f741e1bc10 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -318,11 +318,13 @@ class LLFileUploadBulk : public view_listener_t  			LLStringUtil::trim(asset_name);  			std::string display_name = LLStringUtil::null; +			LLAssetStorage::LLStoreAssetCallback callback = NULL;  			S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); -			upload_new_resource(filename, asset_name, asset_name, LLFolderType::FT_NONE, LLInventoryType::IT_NONE, +			void *userdata = NULL; +			upload_new_resource(filename, asset_name, asset_name, 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,  				LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),  					    display_name, -					    NULL, expected_upload_cost); +					    callback, expected_upload_cost, userdata);  			// *NOTE: Ew, we don't iterate over the file list here,  			// we handle the next files in upload_done_callback() @@ -478,15 +480,16 @@ void handle_compress_image(void*)  }  void upload_new_resource(const std::string& src_filename, std::string name, -			 std::string desc, +			 std::string desc, S32 compression_info,  			 LLFolderType::EType destination_folder_type,  			 LLInventoryType::EType inv_type,  			 U32 next_owner_perms,  			 U32 group_perms,  			 U32 everyone_perms,  			 const std::string& display_name, -			 boost::function<void(const LLUUID& uuid)> callback, -			 S32 expected_upload_cost) +			 LLAssetStorage::LLStoreAssetCallback callback, +			 S32 expected_upload_cost, +			 void *userdata)  {	  	// Generate the temporary UUID.  	std::string filename = gDirUtilp->getTempFilename(); @@ -768,9 +771,9 @@ void upload_new_resource(const std::string& src_filename, std::string name,  		{  			t_disp_name = src_filename;  		} -		upload_new_resource(tid, asset_type, name, desc, +		upload_new_resource(tid, asset_type, name, desc, compression_info, // tid  				    destination_folder_type, inv_type, next_owner_perms, group_perms, everyone_perms, -				    display_name, callback, expected_upload_cost); +				    display_name, callback, expected_upload_cost, userdata);  	}  	else  	{ @@ -889,28 +892,30 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt  		LLStringUtil::trim(asset_name);  		std::string display_name = LLStringUtil::null; +		LLAssetStorage::LLStoreAssetCallback callback = NULL; +		void *userdata = NULL;  		upload_new_resource(next_file, asset_name, asset_name,	// file -				    LLFolderType::FT_NONE, LLInventoryType::IT_NONE, +				    0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,  				    PERM_NONE, PERM_NONE, PERM_NONE,  				    display_name, -				    NULL, -				    expected_upload_cost); // assuming next in a group of uploads is of roughly the same type, i.e. same upload cost -				 +				    callback, +				    expected_upload_cost, // assuming next in a group of uploads is of roughly the same type, i.e. same upload cost +				    userdata);  	}  } -void upload_new_resource(const LLTransactionID &tid,  -			 LLAssetType::EType asset_type, +void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type,  			 std::string name, -			 std::string desc,  +			 std::string desc, S32 compression_info,  			 LLFolderType::EType destination_folder_type,  			 LLInventoryType::EType inv_type,  			 U32 next_owner_perms,  			 U32 group_perms,  			 U32 everyone_perms,  			 const std::string& display_name, -			 boost::function<void(const LLUUID& uuid)> callback, -			 S32 expected_upload_cost) +			 LLAssetStorage::LLStoreAssetCallback callback, +			 S32 expected_upload_cost, +			 void *userdata)  {  	if(gDisconnected)  	{ @@ -954,26 +959,79 @@ void upload_new_resource(const LLTransactionID &tid,  	upload_message.append(display_name);  	LLUploadDialog::modalUploadDialog(upload_message); +	llinfos << "*** Uploading: " << llendl; +	llinfos << "Type: " << LLAssetType::lookup(asset_type) << llendl; +	llinfos << "UUID: " << uuid << llendl; +	llinfos << "Name: " << name << llendl; +	llinfos << "Desc: " << desc << llendl; +	llinfos << "Expected Upload Cost: " << expected_upload_cost << llendl; +	lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type) << llendl; +	lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl;  	std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory"); -	 -	if (url.empty()) { -		llwarns << "Could not get NewFileAgentInventory capability" << llendl; -		return; -	} +	if (!url.empty()) +	{ +		llinfos << "New Agent Inventory via capability" << llendl; +		LLSD body; +		body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type); +		body["asset_type"] = LLAssetType::lookup(asset_type); +		body["inventory_type"] = LLInventoryType::lookup(inv_type); +		body["name"] = name; +		body["description"] = desc; +		body["next_owner_mask"] = LLSD::Integer(next_owner_perms); +		body["group_mask"] = LLSD::Integer(group_perms); +		body["everyone_mask"] = LLSD::Integer(everyone_perms); +		body["expected_upload_cost"] = LLSD::Integer(expected_upload_cost); +		 +		//std::ostringstream llsdxml; +		//LLSDSerialize::toPrettyXML(body, llsdxml); +		//llinfos << "posting body to capability: " << llsdxml.str() << llendl; -	llinfos << "New Agent Inventory via capability" << llendl; -	LLSD body; -	body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type); -	body["asset_type"] = LLAssetType::lookup(asset_type); -	body["inventory_type"] = LLInventoryType::lookup(inv_type); -	body["name"] = name; -	body["description"] = desc; -	body["next_owner_mask"] = LLSD::Integer(next_owner_perms); -	body["group_mask"] = LLSD::Integer(group_perms); -	body["everyone_mask"] = LLSD::Integer(everyone_perms); -	body["expected_upload_cost"] = LLSD::Integer(expected_upload_cost); +		LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, uuid, asset_type)); +	} +	else +	{ +		llinfos << "NewAgentInventory capability not found, new agent inventory via asset system." << llendl; +		// check for adequate funds +		// TODO: do this check on the sim +		if (LLAssetType::AT_SOUND == asset_type || +			LLAssetType::AT_TEXTURE == asset_type || +			LLAssetType::AT_ANIMATION == asset_type) +		{ +			S32 balance = gStatusBar->getBalance(); +			if (balance < expected_upload_cost) +			{ +				LLStringUtil::format_map_t args; +				args["NAME"] = name; +				args["AMOUNT"] = llformat("%d", expected_upload_cost); +				// insufficient funds, bail on this upload +				LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("UploadingCosts", args), expected_upload_cost ); +				return; +			} +		} -	LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, uuid, asset_type, callback)); +		LLResourceData* data = new LLResourceData; +		data->mAssetInfo.mTransactionID = tid; +		data->mAssetInfo.mUuid = uuid; +		data->mAssetInfo.mType = asset_type; +		data->mAssetInfo.mCreatorID = gAgentID; +		data->mInventoryType = inv_type; +		data->mNextOwnerPerm = next_owner_perms; +		data->mExpectedUploadCost = expected_upload_cost; +		data->mUserData = userdata; +		data->mAssetInfo.setName(name); +		data->mAssetInfo.setDescription(desc); +		data->mPreferredLocation = destination_folder_type; + +		LLAssetStorage::LLStoreAssetCallback asset_callback = &upload_done_callback; +		if (callback) +		{ +			asset_callback = callback; +		} +		gAssetStorage->storeAssetData(data->mAssetInfo.mTransactionID, data->mAssetInfo.mType, +										asset_callback, +										(void*)data, +										FALSE); +	}  }  void init_menu_file() diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h index 33f8243ac0..1e6d13f1c6 100644 --- a/indra/newview/llviewermenufile.h +++ b/indra/newview/llviewermenufile.h @@ -34,35 +34,41 @@  #define LLVIEWERMENUFILE_H  #include "llfoldertype.h" +#include "llassetstorage.h"  #include "llinventorytype.h"  class LLTransactionID; +  void init_menu_file();  void upload_new_resource(const std::string& src_filename,   			 std::string name,  			 std::string desc,  +			 S32 compression_info,  			 LLFolderType::EType destination_folder_type,  			 LLInventoryType::EType inv_type,  			 U32 next_owner_perms,  			 U32 group_perms,  			 U32 everyone_perms,  			 const std::string& display_name, -			 boost::function<void(const LLUUID& uuid)> callback, -			 S32 expected_upload_cost); +			 LLAssetStorage::LLStoreAssetCallback callback, +			 S32 expected_upload_cost, +			 void *userdata);  void upload_new_resource(const LLTransactionID &tid,   			 LLAssetType::EType type,  			 std::string name,  			 std::string desc,  +			 S32 compression_info,  			 LLFolderType::EType destination_folder_type,  			 LLInventoryType::EType inv_type,  			 U32 next_owner_perms,  			 U32 group_perms,  			 U32 everyone_perms,  			 const std::string& display_name, -			 boost::function<void(const LLUUID& uuid)> callback, -			 S32 expected_upload_cost); +			 LLAssetStorage::LLStoreAssetCallback callback, +			 S32 expected_upload_cost, +			 void *userdata);  #endif diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 0a65cb7330..c4135f9409 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2462,7 +2462,7 @@ void LLViewerWindow::updateUI()  	LLLayoutStack::updateClass();  	// use full window for world view when not rendering UI -	bool world_view_uses_full_window = !gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI); +	bool world_view_uses_full_window = gAgentCamera.cameraMouselook() || !gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI);  	updateWorldViewRect(world_view_uses_full_window);  	LLView::sMouseHandlerMessage.clear(); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 3e93dc1a90..eb0d4cb8ae 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3551,7 +3551,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  //							AUDIO_STEP_LO_SPEED, AUDIO_STEP_HI_SPEED,  //							AUDIO_STEP_LO_GAIN, AUDIO_STEP_HI_GAIN ); -			const F32 STEP_VOLUME = 0.5f; +			const F32 STEP_VOLUME = 0.3f;  			const LLUUID& step_sound_id = getStepSound();  			LLVector3d foot_pos_global = gAgent.getPosGlobalFromAgent(foot_pos_agent); diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index a4d888cd72..91af5fefde 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1267,8 +1267,8 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLTexLayerSet* layerset)  //-----------------------------------------------------------------------------  BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) const  { -	//const U32 desired_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel");  -	const U32 desired_tex_discard_level = 0; // SERAPH hack to not bake textures on lower discard levels. +	const U32 desired_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel");  +	// const U32 desired_tex_discard_level = 0; // hack to not bake textures on lower discard levels.  	for (U32 i = 0; i < mBakedTextureDatas.size(); i++)  	{ @@ -1299,8 +1299,8 @@ BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) cons  BOOL LLVOAvatarSelf::isAllLocalTextureDataFinal() const  { -	// const U32 desired_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel");  -	const U32 desired_tex_discard_level = 0; // SERAPH hack to not bake textures on lower discard levels +	const U32 desired_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel");  +	// const U32 desired_tex_discard_level = 0; // hack to not bake textures on lower discard levels  	for (U32 i = 0; i < mBakedTextureDatas.size(); i++)  	{ diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index f86838194e..5e9c4dcec8 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -106,24 +106,9 @@ LLPanelWearableOutfitItem* LLPanelWearableOutfitItem::create(LLViewerInventoryIt  	return list_item;  } -BOOL LLPanelWearableOutfitItem::handleDoubleClick(S32 x, S32 y, MASK mask) +LLPanelWearableOutfitItem::LLPanelWearableOutfitItem(LLViewerInventoryItem* item) +: LLPanelInventoryListItemBase(item)  { -	LLViewerInventoryItem* item = getItem(); -	if (item) -	{ -		LLUUID id = item->getUUID(); - -		if (get_is_item_worn(id)) -		{ -			LLAppearanceMgr::getInstance()->removeItemFromAvatar(id); -		} -		else -		{ -			LLAppearanceMgr::getInstance()->wearItemOnAvatar(id, true, false); -		} -	} - -	return LLUICtrl::handleDoubleClick(x, y, mask);  }  // virtual @@ -139,11 +124,6 @@ void LLPanelWearableOutfitItem::updateItem(const std::string& name)  	LLPanelInventoryListItemBase::updateItem(search_label);  } -LLPanelWearableOutfitItem::LLPanelWearableOutfitItem(LLViewerInventoryItem* item) -: LLPanelInventoryListItemBase(item) -{ -} -  //////////////////////////////////////////////////////////////////////////  //////////////////////////////////////////////////////////////////////////  ////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index 2f95c733aa..fe859075c4 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -56,13 +56,13 @@ class LLPanelWearableListItem : public LLPanelInventoryListItemBase  public:  	/** -	 * Shows buttons when mouse is over -	 */ +	* Shows buttons when mouse is over +	*/  	/*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);  	/** -	 * Hides buttons when mouse is out -	 */ +	* Hides buttons when mouse is out +	*/  	/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);  protected: @@ -84,18 +84,12 @@ public:  	static LLPanelWearableOutfitItem* create(LLViewerInventoryItem* item);  	/** -	 * Puts item on if it is not worn by agent -	 * otherwise takes it off on double click. -	 */ -	/*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask); - -	/**  	 * Updates item name and (worn) suffix.  	 */  	/*virtual*/ void updateItem(const std::string& name); -protected: +protected:  	LLPanelWearableOutfitItem(LLViewerInventoryItem* item);  }; diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 7d81c3e551..452b2ac664 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -1,166 +1,399 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater   legacy_header_height="18" - can_minimize="true" - can_close="false" + can_minimize="false" + can_close="true"   follows="left|top" - height="340" + height="516"   layout="topleft"   name="Snapshot"   help_topic="snapshot"   save_rect="true"   save_visibility="true" - can_dock="true" - title="Snapshot" - width="250"> -  <floater.string -   name="unknown"> -    unknown -  </floater.string> -  <floater.string -   name="share_to_web_url" translate="false"> -    http://pdp36.lindenlab.com:12777/ -  </floater.string> -  <view -    height="160" -    width="230" + title="SNAPSHOT PREVIEW" + width="215">    +    <floater.string +     name="share_to_web_url" translate="false"> +http://pdp36.lindenlab.com:12777/ +    </floater.string> +    <floater.string +     name="unknown"> +        unknown +    </floater.string> +    <radio_group +     height="58" +     label="Snapshot type" +     layout="topleft" +     left="10" +     name="snapshot_type_radio" +     top="25" +     width="205"> +        <radio_item +         bottom="19" +         height="16" +         label="Email" +         layout="topleft" +         name="postcard" /> +        <radio_item +         bottom="38" +         height="16" +         label="My inventory (L$[AMOUNT])" +         layout="topleft" +         name="texture" /> +        <radio_item +         bottom="57" +         height="16" +         label="Save to my computer" +         layout="topleft" +         name="local" /> +    </radio_group> +  <ui_ctrl  +    height="90" +    width="125"      layout="topleft"      name="thumbnail_placeholder" -    top_pad="30" +    top_pad="6"      follows="left|top"      left="10"      /> -  <button -    follows="left|top" -    height="22" -    image_overlay="Refresh_Off" -    layout="topleft" -    left="20" -    top_pad="-30" -    name="new_snapshot_btn" -    width="23" -    commit_callback.function="Snapshot.Refresh"/> -  <line_editor -    border_style="line" -    border_thickness="1" -    follows="left|top" -    height="20" -    layout="topleft" -    left="10" -    max_length="500" -    name="description" -    top_pad="15" -    width="230" -    label="Description"/> -  <panel -   top_pad="20" -   left="10" -   height="83" -   name="panel_snapshot_main" -   width="130"> -    <button -     label="Share Snapshot" -     name="share" -     top="0" -     left="0" -     width="130" -     commit_callback.function="Snapshot.ShowButtons" -     commit_callback.parameter="share"/> -    <button -     label="Save Snapshot" -     name="save" -     top_pad="7" +    <text +     type="string" +     font="SansSerifSmall" +     length="1" +     follows="left|top" +     height="14" +     layout="topleft" +     right="-5"       left_delta="0" -     width="130" -     commit_callback.function="Snapshot.ShowButtons" -     commit_callback.parameter="save"/> +     halign="right" +     name="file_size_label" +     top_pad="10" +     width="195"> +        [SIZE] KB +    </text>      <button -     label="Set As Profile Pic" -     name="set_profile_pic" -     top_pad="7" -     left_delta="0" -     width="130"/> -  </panel> -  <panel -   top_delta="0" -   left_delta="0" -   height="83" -   name="panel_snapshot_share" -   width="130"> +     follows="left|top" +     height="22" +     image_overlay="Refresh_Off" +     layout="topleft" +     left="10" +     name="new_snapshot_btn" +     width="23" />      <button -     label="Share to Web" -     name="share_to_web" -     top="0" -     left="0" -     visible="false" -     width="130"/> +     follows="left|top" +     height="23" +     label="Send" +     layout="topleft" +     left_pad="5" +     right="-5" +     name="send_btn" +     width="100" />      <button -     label="Email Snapshot" -     name="share_to_email" -     top_pad="7" -     left_delta="0" -     width="130"/> +     follows="left|top" +     height="23" +     label="Save (L$[AMOUNT])" +     layout="topleft" +     right="-5" +     name="upload_btn" +     top_delta="0" +     width="100" /> +    <flyout_button +     follows="left|top" +     height="23" +     label="Save" +     layout="topleft" +     right="-5" +     name="save_btn" +     tool_tip="Save image to a file" +     top_delta="0" +     width="100"> +        <flyout_button.item +         label="Save" +         name="save_item" +         value="save" /> +        <flyout_button.item +         label="Save As..." +         name="saveas_item" +         value="save as" /> +    </flyout_button> +        <button +     follows="left|top" +     height="23" +     label="More" +     layout="topleft" +     left="10" +     name="more_btn" +     tool_tip="Advanced options" +     width="80" />      <button -     label="Back" -     name="cancel_share" -     top_pad="7" +     follows="left|top" +     height="23" +     label="Less" +     layout="topleft"       left_delta="0" -     width="130" -     commit_callback.function="Snapshot.ShowButtons" -     commit_callback.parameter="main"/> -  </panel> -  <panel -   top_delta="0" -   left_delta="0" -   height="83" -   name="panel_snapshot_save" -   width="130"> +     name="less_btn" +     tool_tip="Advanced options" +     top_delta="0" +     width="80" />      <button -     label="Save to My Inventory" -     name="save_to_inventory" -     top="0" -     left="0" -     width="130"/> -    <button -     label="Save to My Computer" -     name="save_to_computer" -     top_pad="7" +     follows="left|top" +     height="23" +     label="Cancel" +     layout="topleft" +     right="-5" +     left_pad="5" +     name="discard_btn" +     width="100" /> +    <text +     type="string" +     length="1" +     follows="top|left" +     height="12" +     layout="topleft" +     left="10" +     name="type_label2" +     top_pad="5" +     width="127"> +        Size +    </text> +    <text +     type="string" +     length="1" +     follows="top|left" +     height="12" +     layout="topleft" +     left_pad="5" +     name="format_label" +     top_delta="0" +     width="70"> +        Format +    </text> +    <combo_box +     height="23" +     label="Resolution" +     layout="topleft" +     left="10" +     name="postcard_size_combo" +     width="120"> +        <combo_box.item +         label="Current Window" +         name="CurrentWindow" +         value="[i0,i0]" /> +        <combo_box.item +         label="640x480" +         name="640x480" +         value="[i640,i480]" /> +        <combo_box.item +         label="800x600" +         name="800x600" +         value="[i800,i600]" /> +        <combo_box.item +         label="1024x768" +         name="1024x768" +         value="[i1024,i768]" /> +        <combo_box.item +         label="Custom" +         name="Custom" +         value="[i-1,i-1]" /> +    </combo_box> +    <combo_box +     height="23" +     label="Resolution" +     layout="topleft"       left_delta="0" -     width="130"/> -    <button -     label="Back" -     name="cancel_save" -     top_pad="7" +     name="texture_size_combo" +     top_delta="0" +     width="127"> +        <combo_box.item +         label="Current Window" +         name="CurrentWindow" +         value="[i0,i0]" /> +        <combo_box.item +         label="Small (128x128)" +         name="Small(128x128)" +         value="[i128,i128]" /> +        <combo_box.item +         label="Medium (256x256)" +         name="Medium(256x256)" +         value="[i256,i256]" /> +        <combo_box.item +         label="Large (512x512)" +         name="Large(512x512)" +         value="[i512,i512]" /> +        <combo_box.item +         label="Custom" +         name="Custom" +         value="[i-1,i-1]" /> +    </combo_box> +    <combo_box +     height="23" +     label="Resolution" +     layout="topleft" +     left_delta="0" +     name="local_size_combo" +     top_delta="0" +     width="127"> +        <combo_box.item +         label="Current Window" +         name="CurrentWindow" +         value="[i0,i0]" /> +        <combo_box.item +         label="320x240" +         name="320x240" +         value="[i320,i240]" /> +        <combo_box.item +         label="640x480" +         name="640x480" +         value="[i640,i480]" /> +        <combo_box.item +         label="800x600" +         name="800x600" +         value="[i800,i600]" /> +        <combo_box.item +         label="1024x768" +         name="1024x768" +         value="[i1024,i768]" /> +        <combo_box.item +         label="1280x1024" +         name="1280x1024" +         value="[i1280,i1024]" /> +        <combo_box.item +         label="1600x1200" +         name="1600x1200" +         value="[i1600,i1200]" /> +        <combo_box.item +         label="Custom" +         name="Custom" +         value="[i-1,i-1]" /> +    </combo_box> +    <combo_box +     height="23" +     label="Format" +     layout="topleft" +     left_pad="5" +     name="local_format_combo" +     width="70"> +        <combo_box.item +         label="PNG" +         name="PNG" /> +        <combo_box.item +         label="JPEG" +         name="JPEG" /> +        <combo_box.item +         label="BMP" +         name="BMP" /> +    </combo_box> +    <spinner +     allow_text_entry="false" +     decimal_digits="0" +     follows="left|top" +     height="20" +     increment="32" +     label="Width" +     label_width="40" +     layout="topleft" +     left="10" +     max_val="6016" +     min_val="32" +     name="snapshot_width" +     top_pad="10" +     width="95" /> +    <spinner +     allow_text_entry="false" +     decimal_digits="0" +     follows="left|top" +     height="20" +     increment="32" +     label="Height" +     label_width="40" +     layout="topleft" +     left_pad="5" +     max_val="6016" +     min_val="32" +     name="snapshot_height" +     top_delta="0" +     width="95" /> +    <check_box +     bottom_delta="20" +     label="Constrain proportions" +     layout="topleft" +     left="10" +     name="keep_aspect_check" /> +    <slider +     decimal_digits="0" +     follows="left|top" +     height="15" +     increment="1" +     initial_value="75" +     label="Image quality" +     label_width="100" +     layout="topleft"       left_delta="0" -     width="130" -     commit_callback.function="Snapshot.ShowButtons" -     commit_callback.parameter="main"/> -  </panel> -  <button -   follows="left" -   height="22" -   layout="topleft" -   left="210" -   name="show_advanced" -   image_overlay="TabIcon_Close_Off" -   bottom_delta="0" -   width="30" -   commit_callback.function="Snapshot.ShowAdvanced"/> -  <button -   follows="left" -   height="22" -   layout="topleft" -   left="210" -   name="hide_advanced" -   image_overlay="TabIcon_Open_Off" -   top_delta="0" -   visible="false" -   width="30" -   commit_callback.function="Snapshot.HideAdvanced"/> -  <panel  -   visible="false" -   left="250" -   top="17" -   name="snapshot_advanced" -   filename="panel_snapshot_advanced.xml"/> +     max_val="100" +     name="image_quality_slider" +     top_pad="5" +     width="205" /> +    <text +     type="string" +     length="1" +     follows="left|top" +     height="13" +     layout="topleft" +     left="10" +     name="layer_type_label" +     top_pad="5" +     width="50"> +        Capture: +    </text> +    <combo_box +     height="23" +     label="Image Layers" +     layout="topleft" +     left="30" +     name="layer_types" +     width="145"> +        <combo_box.item +         label="Colors" +         name="Colors" +         value="colors" /> +        <combo_box.item +         label="Depth" +         name="Depth" +         value="depth" /> +    </combo_box> +    <check_box +     label="Interface" +     layout="topleft" +     left="30" +     top_pad="10" +     width="180" +     name="ui_check" /> +    <check_box +     label="HUDs" +     layout="topleft" +     left="30" +     top_pad="10" +     width="180" +     name="hud_check" /> +    <check_box +     label="Keep open after saving" +     layout="topleft" +     left="10" +     top_pad="8" +     width="180" +     name="keep_open_check" /> +    <check_box +     label="Freeze frame (fullscreen)" +     layout="topleft" +     left="10" +     top_pad="8" +     width="180" +     name="freeze_frame_check" /> +    <check_box +     label="Auto-refresh" +     layout="topleft" +     left="10" +     top_pad="8" +     width="180" +     name="auto_snapshot_check" />  </floater> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 2641ce4ee4..3557318705 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -927,7 +927,7 @@          <menu_item_check           label="Show Advanced Menu"           name="Show Advanced Menu" -         shortcut="control|alt|D"> +         shortcut="control|alt|shift|D">            <on_check             function="CheckControl"             parameter="UseDebugMenus" /> @@ -1477,6 +1477,18 @@                  <menu_item_call.on_click                   function="View.DefaultUISize" />              </menu_item_call> +            <!-- This second, alternative shortcut for Show Advanced Menu is for backward compatibility.  The main shortcut has been changed so it's Linux-friendly, where the old shortcut is typically eaten by the window manager. --> +            <menu_item_check +               label="Show Advanced Menu - legacy shortcut" +               name="Show Advanced Menu - legacy shortcut" +               shortcut="control|alt|D"> +              <on_check +		 function="CheckControl" +		 parameter="UseDebugMenus" /> +              <on_click +		 function="ToggleControl" +		 parameter="UseDebugMenus" /> +            </menu_item_check>              <menu_item_separator/>              <menu_item_check               label="Always Run" @@ -1652,7 +1664,6 @@               function="ToggleControl"               parameter="QAMode" />          </menu_item_check> -          </menu>      <menu       create_jump_keys="true" @@ -3278,4 +3289,4 @@              </menu>          </menu>      </menu> -</menu_bar>
\ No newline at end of file +</menu_bar> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index cf3097cb06..20a2a7d954 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -4518,18 +4518,6 @@ Uploading in-world and web site snapshots...    </notification>    <notification -   icon="alertmodal.tga" -   name="UploadConfirmation" -   type="alertmodal"> -Uploading costs L$[AMOUNT]. -Do you wish to proceed? -    <usetemplate -     name="okcancelbuttons" -     notext="Cancel" -     yestext="Upload"/> -  </notification> - -  <notification     icon="notify.tga"     name="UploadPayment"     persist="true" @@ -5527,14 +5515,6 @@ Failed to find [TYPE] named [DESC] in database.    <notification     icon="notify.tga" -   name="ShareToWebFailed" -   persist="true" -   type="notify"> -    Failed to upload image to web. -  </notification> -   -  <notification -   icon="notify.tga"     name="InvalidWearable"     persist="true"     type="notify"> diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml index 37eb5eaa98..c1e5ae50e6 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml @@ -48,6 +48,7 @@             mouse_opaque="true"             name="cof_tab"             start_folder="Current Outfit" +           use_label_suffix="false"              width="315" />     </tab_container>  	 <panel @@ -83,18 +84,18 @@        width="241"          /> -     <dnd_button -      follows="bottom|right" -      height="25" -      image_hover_unselected="Toolbar_Right_Over" -      image_overlay="TrashItem_Off" -      image_selected="Toolbar_Right_Selected" -      image_unselected="Toolbar_Right_Off" -      layout="topleft" -      left_pad="1" -      name="trash_btn" +        <dnd_button +         follows="bottom|right" +         height="25" +         image_hover_unselected="Toolbar_Right_Over" +          image_overlay="TrashItem_Off" +          image_selected="Toolbar_Right_Selected" +          image_unselected="Toolbar_Right_Off" +         layout="topleft" +         left_pad="1" +         name="trash_btn"        tool_tip="Delete selected outfit" -      width="31"/> +         width="31"/>                <button         follows="bottom|left"         height="23" diff --git a/indra/newview/skins/default/xui/en/panel_scrolling_param.xml b/indra/newview/skins/default/xui/en/panel_scrolling_param.xml index 19eb4bb0d6..78d64620a5 100644 --- a/indra/newview/skins/default/xui/en/panel_scrolling_param.xml +++ b/indra/newview/skins/default/xui/en/panel_scrolling_param.xml @@ -12,6 +12,8 @@       layout="topleft"       left="12"       name="min param text" +     text_color="EmphasisColor" +     font_shadow="hard"       top="120"       width="120" />      <text @@ -20,6 +22,8 @@       layout="topleft"       left="155"       name="max param text" +     text_color="EmphasisColor"  +     font_shadow="hard"       top_delta="0"       width="120" />      <text diff --git a/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml b/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml index a71b293f31..e05ddf9815 100644 --- a/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml +++ b/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml @@ -11,6 +11,6 @@       name="no_items_msg"       v_pad="10"       h_pad="10" -     value="There are no any items in the list" +     value="No matches found"       wrap="true" />  </flat_list_view>
\ No newline at end of file | 
