From f15b542c19437670f7f0b6303ec7c259f778c43b Mon Sep 17 00:00:00 2001
From: Armin Weatherwax
Date: Mon, 30 Aug 2010 14:21:00 +0200
Subject: Henri Beauchamp: polish up of the animation preview when uploading

---
 linden/indra/newview/app_settings/settings.xml     |  25 +-
 linden/indra/newview/llfloateranimpreview.cpp      | 459 +++++++++++++++++----
 linden/indra/newview/llfloateranimpreview.h        |  12 +-
 .../xui/en-us/floater_animation_preview.xml        |   9 +-
 4 files changed, 406 insertions(+), 99 deletions(-)

diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml
index b1917ec..7071de2 100644
--- a/linden/indra/newview/app_settings/settings.xml
+++ b/linden/indra/newview/app_settings/settings.xml
@@ -518,6 +518,17 @@
     <key>Value</key>
     <integer>0</integer>
   </map>
+  <key>PreviewAnimInWorld</key>
+  <map>
+    <key>Comment</key>
+    <string>Play animation preview in-world when uploading</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Boolean</string>
+    <key>Value</key>
+    <integer>0</integer>
+  </map>
   <key>PrivateLookAtTarget</key>
   <map>
     <key>Comment</key>
@@ -8243,10 +8254,10 @@
       <string>Rect</string>
       <key>Value</key>
       <array>
-       <integer>11</integer>
-       <integer>459</integer>
-       <integer>311</integer>
-       <integer>173</integer>
+        <integer>0</integer>
+        <integer>85</integer>
+        <integer>300</integer>
+        <integer>0</integer>
       </array>
     </map>
     <key>PreviewClassifiedRect</key>
@@ -8307,9 +8318,9 @@
       <string>Rect</string>
       <key>Value</key>
       <array>
-	<integer>0</integer>
-	<integer>530</integer>
-	<integer>420</integer>
+        <integer>0</integer>
+        <integer>85</integer>
+        <integer>300</integer>
         <integer>0</integer>
       </array>
     </map>
diff --git a/linden/indra/newview/llfloateranimpreview.cpp b/linden/indra/newview/llfloateranimpreview.cpp
index ce7737d..da1d5fc 100644
--- a/linden/indra/newview/llfloateranimpreview.cpp
+++ b/linden/indra/newview/llfloateranimpreview.cpp
@@ -162,12 +162,27 @@ BOOL LLFloaterAnimPreview::postBuild()
 		return FALSE;
 	}
 
+	mInWorld = gSavedSettings.getBOOL("PreviewAnimInWorld");
+
 	childSetCommitCallback("name_form", onCommitName, this);
 
 	childSetLabelArg("ok_btn", "[UPLOADFEE]", gHippoGridManager->getConnectedGrid()->getUploadFee());
 	childSetAction("ok_btn", onBtnOK, this);
 	setDefaultBtn();
 
+	if (mInWorld)
+	{
+		r = getRect();
+		translate(0, 230);
+		reshape(r.getWidth(), r.getHeight() - 230);
+		childSetValue("bad_animation_text", getString("in_world"));
+		childShow("bad_animation_text");
+	}
+	else
+	{
+		childHide("bad_animation_text");
+	}
+
 	mPreviewRect.set(PREVIEW_HPAD, 
 		PREVIEW_TEXTURE_HEIGHT,
 		getRect().getWidth() - PREVIEW_HPAD, 
@@ -209,8 +224,6 @@ BOOL LLFloaterAnimPreview::postBuild()
 	r.set(r.mRight + PREVIEW_HPAD, y, getRect().getWidth() - PREVIEW_HPAD, y - BTN_HEIGHT);
 	//childSetCommitCallback("playback_slider", onSliderMove, this);
 
-	childHide("bad_animation_text");
-
 	//childSetCommitCallback("preview_base_anim", onCommitBaseAnim, this);
 	//childSetValue("preview_base_anim", "Standing");
 
@@ -275,7 +288,14 @@ BOOL LLFloaterAnimPreview::postBuild()
 		// motion will be returned, but it will be in a load-pending state, as this is a new motion
 		// this motion will not request an asset transfer until next update, so we have a chance to 
 		// load the keyframe data locally
-		motionp = (LLKeyframeMotion*)mAnimPreview->getDummyAvatar()->createMotion(mMotionID);
+		if (mInWorld)
+		{
+			motionp = (LLKeyframeMotion*)gAgent.getAvatarObject()->createMotion(mMotionID);
+		}
+		else
+		{
+			motionp = (LLKeyframeMotion*)mAnimPreview->getDummyAvatar()->createMotion(mMotionID);
+		}
 
 		// create data buffer for keyframe initialization
 		S32 buffer_size = loaderp->getOutputSize();
@@ -293,24 +313,30 @@ BOOL LLFloaterAnimPreview::postBuild()
 		if (success)
 		{
 			setAnimCallbacks() ;
-			
-			const LLBBoxLocal &pelvis_bbox = motionp->getPelvisBBox();
 
-			LLVector3 temp = pelvis_bbox.getCenter();
-			// only consider XY?
-			//temp.mV[VZ] = 0.f;
-			F32 pelvis_offset = temp.magVec();
+			if (!mInWorld)
+			{
+				const LLBBoxLocal &pelvis_bbox = motionp->getPelvisBBox();
 
-			temp = pelvis_bbox.getExtent();
-			//temp.mV[VZ] = 0.f;
-			F32 pelvis_max_displacement = pelvis_offset + (temp.magVec() * 0.5f) + 1.f;
-			
-			F32 camera_zoom = LLViewerCamera::getInstance()->getDefaultFOV() / (2.f * atan(pelvis_max_displacement / PREVIEW_CAMERA_DISTANCE));
-		
-			mAnimPreview->setZoom(camera_zoom);
+				LLVector3 temp = pelvis_bbox.getCenter();
+				// only consider XY?
+				//temp.mV[VZ] = 0.f;
+				F32 pelvis_offset = temp.magVec();
+
+				temp = pelvis_bbox.getExtent();
+				//temp.mV[VZ] = 0.f;
+				F32 pelvis_max_displacement = pelvis_offset + (temp.magVec() * 0.5f) + 1.f;
+
+				F32 camera_zoom = LLViewerCamera::getInstance()->getDefaultFOV() / (2.f * atan(pelvis_max_displacement / PREVIEW_CAMERA_DISTANCE));
+
+				mAnimPreview->setZoom(camera_zoom);
+			}
 
 			motionp->setName(childGetValue("name_form").asString());
-			mAnimPreview->getDummyAvatar()->startMotion(mMotionID);
+			if (!mInWorld)
+			{
+				mAnimPreview->getDummyAvatar()->startMotion(mMotionID);
+			}
 			childSetMinValue("playback_slider", 0.0);
 			childSetMaxValue("playback_slider", 1.0);
 
@@ -326,7 +352,6 @@ BOOL LLFloaterAnimPreview::postBuild()
 			seconds_string = llformat(" - %.2f seconds", motionp->getDuration());
 
 			setTitle(mFilename + std::string(seconds_string));
-
 		}
 		else
 		{
@@ -372,13 +397,26 @@ BOOL LLFloaterAnimPreview::postBuild()
 //-----------------------------------------------------------------------------
 LLFloaterAnimPreview::~LLFloaterAnimPreview()
 {
-	if (mMotionID.notNull() && mAnimPreview)
+	if (mInWorld)
 	{
-		mAnimPreview->getDummyAvatar()->deactivateAllMotions();
-		mAnimPreview->getDummyAvatar()->removeMotion(mMotionID);
-		LLKeyframeDataCache::removeKeyframeData(mMotionID);
+		LLVOAvatar* avatarp = gAgent.getAvatarObject();
+		if (avatarp)
+		{
+			if (mMotionID.notNull())
+			{
+				avatarp->stopMotion(mMotionID, TRUE);
+				avatarp->removeMotion(mMotionID);
+			}
+			avatarp->deactivateAllMotions();
+			avatarp->startMotion(ANIM_AGENT_HEAD_ROT);
+			avatarp->startMotion(ANIM_AGENT_EYE);
+			avatarp->startMotion(ANIM_AGENT_BODY_NOISE);
+			avatarp->startMotion(ANIM_AGENT_BREATHE_ROT);
+			avatarp->startMotion(ANIM_AGENT_HAND_MOTION);
+			avatarp->startMotion(ANIM_AGENT_PELVIS_FIX);
+			avatarp->startMotion(ANIM_AGENT_STAND, BASE_ANIM_TIME_OFFSET);
+		}
 	}
-
 	delete mAnimPreview;
 	mAnimPreview = NULL;
 
@@ -395,9 +433,9 @@ void LLFloaterAnimPreview::draw()
 
 	refresh();
 
-	if (mMotionID.notNull() && mAnimPreview)
+	if (mMotionID.notNull() && mAnimPreview && !mInWorld)
 	{
-/*		gGL.color3f(1.f, 1.f, 1.f);
+		gGL.color3f(1.f, 1.f, 1.f);
 
 		gGL.getTexUnit(0)->bind(mAnimPreview->getTexture());
 
@@ -415,7 +453,7 @@ void LLFloaterAnimPreview::draw()
 		gGL.end();
 
 		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-*/
+
 		LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
 		if (!avatarp->areAnimationsPaused())
 		{
@@ -429,7 +467,20 @@ void LLFloaterAnimPreview::draw()
 //-----------------------------------------------------------------------------
 void LLFloaterAnimPreview::resetMotion()
 {
-	LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+	LLVOAvatar* avatarp;
+	if (mInWorld)
+	{
+		avatarp = gAgent.getAvatarObject();
+	}
+	else
+	{
+		avatarp = mAnimPreview->getDummyAvatar();
+	}
+	if (!avatarp)
+	{
+		return;
+	}
+
 	BOOL paused = avatarp->areAnimationsPaused();
 
 	// *TODO: Fix awful casting hack
@@ -459,13 +510,13 @@ void LLFloaterAnimPreview::resetMotion()
 		mPauseRequest = NULL;	
 	}
 }
-/*
+
 //-----------------------------------------------------------------------------
 // handleMouseDown()
 //-----------------------------------------------------------------------------
 BOOL LLFloaterAnimPreview::handleMouseDown(S32 x, S32 y, MASK mask)
 {
-	if (mPreviewRect.pointInRect(x, y))
+	if (!mInWorld && mPreviewRect.pointInRect(x, y))
 	{
 		bringToFront( x, y );
 		gFocusMgr.setMouseCapture(this);
@@ -483,8 +534,11 @@ BOOL LLFloaterAnimPreview::handleMouseDown(S32 x, S32 y, MASK mask)
 //-----------------------------------------------------------------------------
 BOOL LLFloaterAnimPreview::handleMouseUp(S32 x, S32 y, MASK mask)
 {
-	gFocusMgr.setMouseCapture(FALSE);
-	gViewerWindow->showCursor();
+	if (!mInWorld)
+	{
+		gFocusMgr.setMouseCapture(FALSE);
+		gViewerWindow->showCursor();
+	}
 	return LLFloater::handleMouseUp(x, y, mask);
 }
 
@@ -493,6 +547,11 @@ BOOL LLFloaterAnimPreview::handleMouseUp(S32 x, S32 y, MASK mask)
 //-----------------------------------------------------------------------------
 BOOL LLFloaterAnimPreview::handleHover(S32 x, S32 y, MASK mask)
 {
+	if (mInWorld)
+	{
+		return TRUE;
+	}
+
 	MASK local_mask = mask & ~MASK_ALT;
 
 	if (mAnimPreview && hasMouseCapture())
@@ -548,9 +607,11 @@ BOOL LLFloaterAnimPreview::handleHover(S32 x, S32 y, MASK mask)
 //-----------------------------------------------------------------------------
 BOOL LLFloaterAnimPreview::handleScrollWheel(S32 x, S32 y, S32 clicks)
 {
-	mAnimPreview->zoom((F32)clicks * -0.2f);
-	mAnimPreview->requestUpdate();
-
+	if (!mInWorld)
+	{
+		mAnimPreview->zoom((F32)clicks * -0.2f);
+		mAnimPreview->requestUpdate();
+	}
 	return TRUE;
 }
 
@@ -559,9 +620,12 @@ BOOL LLFloaterAnimPreview::handleScrollWheel(S32 x, S32 y, S32 clicks)
 //-----------------------------------------------------------------------------
 void LLFloaterAnimPreview::onMouseCaptureLost()
 {
-	gViewerWindow->showCursor();
+	if (!mInWorld)
+	{
+		gViewerWindow->showCursor();
+	}
 }
-*/
+
 //-----------------------------------------------------------------------------
 // onBtnPlay()
 //-----------------------------------------------------------------------------
@@ -571,9 +635,25 @@ void LLFloaterAnimPreview::onBtnPlay(void* user_data)
 	if (!previewp->getEnabled())
 		return;
 
-	if (previewp->mMotionID.notNull() && previewp->mAnimPreview)
+	if (previewp->mMotionID.notNull())
 	{
-		LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+		LLVOAvatar* avatarp;
+		if (previewp->mInWorld)
+		{
+			if (!gAgent.getAvatarObject())
+			{
+				return;
+			}
+			avatarp = gAgent.getAvatarObject();
+		}
+		else
+		{
+			if (!previewp->mAnimPreview)
+			{
+				return;
+			}
+			avatarp = previewp->mAnimPreview->getDummyAvatar();
+		}
 
 		if(!avatarp->isMotionActive(previewp->mMotionID))
 		{
@@ -603,9 +683,25 @@ void LLFloaterAnimPreview::onBtnStop(void* user_data)
 	if (!previewp->getEnabled())
 		return;
 
-	if (previewp->mMotionID.notNull() && previewp->mAnimPreview)
+	if (previewp->mMotionID.notNull())
 	{
-		LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+		LLVOAvatar* avatarp;
+		if (previewp->mInWorld)
+		{
+			if (!gAgent.getAvatarObject())
+			{
+				return;
+			}
+			avatarp = gAgent.getAvatarObject();
+		}
+		else
+		{
+			if (!previewp->mAnimPreview)
+			{
+				return;
+			}
+			avatarp = previewp->mAnimPreview->getDummyAvatar();
+		}
 		previewp->resetMotion();
 		previewp->mPauseRequest = avatarp->requestPause();
 	}
@@ -620,21 +716,33 @@ void LLFloaterAnimPreview::onSliderMove(LLUICtrl* ctrl, void*user_data)
 	if (!previewp->getEnabled())
 		return;
 
-	if (previewp->mAnimPreview)
-	{
-		LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
-		F32 slider_value = (F32)previewp->childGetValue("playback_slider").asReal();
-		LLUUID base_id = previewp->mIDList[previewp->childGetValue("preview_base_anim").asString()];
-		LLMotion* motionp = avatarp->findMotion(previewp->mMotionID);
-		F32 duration = motionp->getDuration();// + motionp->getEaseOutDuration();
-		F32 delta_time = duration * slider_value;
-		avatarp->deactivateAllMotions();
-		avatarp->startMotion(base_id, delta_time + BASE_ANIM_TIME_OFFSET);
-		avatarp->startMotion(previewp->mMotionID, delta_time);
-		previewp->mPauseRequest = avatarp->requestPause();
-		previewp->refresh();
+	LLVOAvatar* avatarp;
+	if (previewp->mInWorld)
+	{
+		if (!gAgent.getAvatarObject())
+		{
+			return;
+		}
+		avatarp = gAgent.getAvatarObject();
 	}
-
+	else
+	{
+		if (!previewp->mAnimPreview)
+		{
+			return;
+		}
+		avatarp = previewp->mAnimPreview->getDummyAvatar();
+	}
+	F32 slider_value = (F32)previewp->childGetValue("playback_slider").asReal();
+	LLUUID base_id = previewp->mIDList[previewp->childGetValue("preview_base_anim").asString()];
+	LLMotion* motionp = avatarp->findMotion(previewp->mMotionID);
+	F32 duration = motionp->getDuration();// + motionp->getEaseOutDuration();
+	F32 delta_time = duration * slider_value;
+	avatarp->deactivateAllMotions();
+	avatarp->startMotion(base_id, delta_time + BASE_ANIM_TIME_OFFSET);
+	avatarp->startMotion(previewp->mMotionID, delta_time);
+	previewp->mPauseRequest = avatarp->requestPause();
+	previewp->refresh();
 }
 
 //-----------------------------------------------------------------------------
@@ -646,24 +754,37 @@ void LLFloaterAnimPreview::onCommitBaseAnim(LLUICtrl* ctrl, void* data)
 	if (!previewp->getEnabled())
 		return;
 
-	if (previewp->mAnimPreview)
+	LLVOAvatar* avatarp;
+	if (previewp->mInWorld)
 	{
-		LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+		if (!gAgent.getAvatarObject())
+		{
+			return;
+		}
+		avatarp = gAgent.getAvatarObject();
+	}
+	else
+	{
+		if (!previewp->mAnimPreview)
+		{
+			return;
+		}
+		avatarp = previewp->mAnimPreview->getDummyAvatar();
+	}
 
-		BOOL paused = avatarp->areAnimationsPaused();
+	BOOL paused = avatarp->areAnimationsPaused();
 
-		// stop all other possible base motions
-		avatarp->stopMotion(ANIM_AGENT_STAND, TRUE);
-		avatarp->stopMotion(ANIM_AGENT_WALK, TRUE);
-		avatarp->stopMotion(ANIM_AGENT_SIT, TRUE);
-		avatarp->stopMotion(ANIM_AGENT_HOVER, TRUE);
+	// stop all other possible base motions
+	avatarp->stopMotion(ANIM_AGENT_STAND, TRUE);
+	avatarp->stopMotion(ANIM_AGENT_WALK, TRUE);
+	avatarp->stopMotion(ANIM_AGENT_SIT, TRUE);
+	avatarp->stopMotion(ANIM_AGENT_HOVER, TRUE);
 
-		previewp->resetMotion();
+	previewp->resetMotion();
 
-		if (!paused)
-		{
-			previewp->mPauseRequest = NULL;
-		}
+	if (!paused)
+	{
+		previewp->mPauseRequest = NULL;
 	}
 }
 
@@ -676,7 +797,23 @@ void LLFloaterAnimPreview::onCommitLoop(LLUICtrl* ctrl, void* data)
 	if (!previewp->getEnabled())
 		return;
 	
-	LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+	LLVOAvatar* avatarp;
+	if (previewp->mInWorld)
+	{
+		if (!gAgent.getAvatarObject())
+		{
+			return;
+		}
+		avatarp = gAgent.getAvatarObject();
+	}
+	else
+	{
+		if (!previewp->mAnimPreview)
+		{
+			return;
+		}
+		avatarp = previewp->mAnimPreview->getDummyAvatar();
+	}
 	LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID);
 
 	if (motionp)
@@ -696,7 +833,23 @@ void LLFloaterAnimPreview::onCommitLoopIn(LLUICtrl* ctrl, void* data)
 	if (!previewp->getEnabled())
 		return;
 
-	LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+	LLVOAvatar* avatarp;
+	if (previewp->mInWorld)
+	{
+		if (!gAgent.getAvatarObject())
+		{
+			return;
+		}
+		avatarp = gAgent.getAvatarObject();
+	}
+	else
+	{
+		if (!previewp->mAnimPreview)
+		{
+			return;
+		}
+		avatarp = previewp->mAnimPreview->getDummyAvatar();
+	}
 	LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID);
 
 	if (motionp)
@@ -717,7 +870,23 @@ void LLFloaterAnimPreview::onCommitLoopOut(LLUICtrl* ctrl, void* data)
 	if (!previewp->getEnabled())
 		return;
 
-	LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+	LLVOAvatar* avatarp;
+	if (previewp->mInWorld)
+	{
+		if (!gAgent.getAvatarObject())
+		{
+			return;
+		}
+		avatarp = gAgent.getAvatarObject();
+	}
+	else
+	{
+		if (!previewp->mAnimPreview)
+		{
+			return;
+		}
+		avatarp = previewp->mAnimPreview->getDummyAvatar();
+	}
 	LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID);
 
 	if (motionp)
@@ -738,7 +907,23 @@ void LLFloaterAnimPreview::onCommitName(LLUICtrl* ctrl, void* data)
 	if (!previewp->getEnabled())
 		return;
 
-	LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+	LLVOAvatar* avatarp;
+	if (previewp->mInWorld)
+	{
+		if (!gAgent.getAvatarObject())
+		{
+			return;
+		}
+		avatarp = gAgent.getAvatarObject();
+	}
+	else
+	{
+		if (!previewp->mAnimPreview)
+		{
+			return;
+		}
+		avatarp = previewp->mAnimPreview->getDummyAvatar();
+	}
 	LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID);
 
 	if (motionp)
@@ -782,7 +967,23 @@ void LLFloaterAnimPreview::onCommitPriority(LLUICtrl* ctrl, void* data)
 	if (!previewp->getEnabled())
 		return;
 
-	LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+	LLVOAvatar* avatarp;
+	if (previewp->mInWorld)
+	{
+		if (!gAgent.getAvatarObject())
+		{
+			return;
+		}
+		avatarp = gAgent.getAvatarObject();
+	}
+	else
+	{
+		if (!previewp->mAnimPreview)
+		{
+			return;
+		}
+		avatarp = previewp->mAnimPreview->getDummyAvatar();
+	}
 	LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID);
 
 	motionp->setPriority(llfloor((F32)previewp->childGetValue("priority").asReal()));
@@ -797,7 +998,23 @@ void LLFloaterAnimPreview::onCommitEaseIn(LLUICtrl* ctrl, void* data)
 	if (!previewp->getEnabled())
 		return;
 
-	LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+	LLVOAvatar* avatarp;
+	if (previewp->mInWorld)
+	{
+		if (!gAgent.getAvatarObject())
+		{
+			return;
+		}
+		avatarp = gAgent.getAvatarObject();
+	}
+	else
+	{
+		if (!previewp->mAnimPreview)
+		{
+			return;
+		}
+		avatarp = previewp->mAnimPreview->getDummyAvatar();
+	}
 	LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID);
 
 	motionp->setEaseIn((F32)previewp->childGetValue("ease_in_time").asReal());
@@ -813,7 +1030,23 @@ void LLFloaterAnimPreview::onCommitEaseOut(LLUICtrl* ctrl, void* data)
 	if (!previewp->getEnabled())
 		return;
 
-	LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+	LLVOAvatar* avatarp;
+	if (previewp->mInWorld)
+	{
+		if (!gAgent.getAvatarObject())
+		{
+			return;
+		}
+		avatarp = gAgent.getAvatarObject();
+	}
+	else
+	{
+		if (!previewp->mAnimPreview)
+		{
+			return;
+		}
+		avatarp = previewp->mAnimPreview->getDummyAvatar();
+	}
 	LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID);
 
 	motionp->setEaseOut((F32)previewp->childGetValue("ease_out_time").asReal());
@@ -829,7 +1062,23 @@ BOOL LLFloaterAnimPreview::validateEaseIn(LLUICtrl* spin, void* data)
 	if (!previewp->getEnabled())
 		return FALSE;
 
-	LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+	LLVOAvatar* avatarp;
+	if (previewp->mInWorld)
+	{
+		if (!gAgent.getAvatarObject())
+		{
+			return FALSE;
+		}
+		avatarp = gAgent.getAvatarObject();
+	}
+	else
+	{
+		if (!previewp->mAnimPreview)
+		{
+			return FALSE;
+		}
+		avatarp = previewp->mAnimPreview->getDummyAvatar();
+	}
 	LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID);
 	
 	if (!motionp->getLoop())
@@ -851,7 +1100,23 @@ BOOL LLFloaterAnimPreview::validateEaseOut(LLUICtrl* spin, void* data)
 	if (!previewp->getEnabled())
 		return FALSE;
 
-	LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
+	LLVOAvatar* avatarp;
+	if (previewp->mInWorld)
+	{
+		if (!gAgent.getAvatarObject())
+		{
+			return FALSE;
+		}
+		avatarp = gAgent.getAvatarObject();
+	}
+	else
+	{
+		if (!previewp->mAnimPreview)
+		{
+			return FALSE;
+		}
+		avatarp = previewp->mAnimPreview->getDummyAvatar();
+	}
 	LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(previewp->mMotionID);
 	
 	if (!motionp->getLoop())
@@ -936,9 +1201,20 @@ void LLFloaterAnimPreview::refresh()
 	}
 	else
 	{
-		childHide("bad_animation_text");
+		if (!mInWorld)
+		{
+			childHide("bad_animation_text");
+		}
 		mPlayButton->setEnabled(TRUE);
-		LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
+		LLVOAvatar* avatarp;
+		if (mInWorld)
+		{
+			avatarp = gAgent.getAvatarObject();
+		}
+		else
+		{
+			avatarp = mAnimPreview->getDummyAvatar();
+		}
 		if (avatarp->isMotionActive(mMotionID))
 		{
 			mStopButton->setEnabled(TRUE);
@@ -971,7 +1247,10 @@ void LLFloaterAnimPreview::refresh()
 			mStopButton->setEnabled(TRUE); // stop also resets, leave enabled.
 		}
 		childEnable("ok_btn");
-		mAnimPreview->requestUpdate();
+		if (!mInWorld)
+		{
+			mAnimPreview->requestUpdate();
+		}
 	}
 }
 
@@ -983,9 +1262,17 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata)
 	LLFloaterAnimPreview* floaterp = (LLFloaterAnimPreview*)userdata;
 	if (!floaterp->getEnabled()) return;
 
-	if (floaterp->mAnimPreview)
+	if ((!floaterp->mInWorld && floaterp->mAnimPreview) || (floaterp->mInWorld && gAgent.getAvatarObject()))
 	{
-		LLKeyframeMotion* motionp = (LLKeyframeMotion*)floaterp->mAnimPreview->getDummyAvatar()->findMotion(floaterp->mMotionID);
+		LLKeyframeMotion* motionp;
+		if (floaterp->mInWorld)
+		{
+			motionp = (LLKeyframeMotion*)gAgent.getAvatarObject()->findMotion(floaterp->mMotionID);
+		}
+		else
+		{
+			motionp = (LLKeyframeMotion*)floaterp->mAnimPreview->getDummyAvatar()->findMotion(floaterp->mMotionID);
+		}
 
 		S32 file_size = motionp->getFileSize();
 		U8* buffer = new U8[file_size];
@@ -1024,7 +1311,15 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata)
 
 		delete [] buffer;
 		// clear out cache for motion data
-		floaterp->mAnimPreview->getDummyAvatar()->removeMotion(floaterp->mMotionID);
+		if (floaterp->mInWorld)
+		{
+			gAgent.getAvatarObject()->removeMotion(floaterp->mMotionID);
+			gAgent.getAvatarObject()->deactivateAllMotions();
+		}
+		else
+		{
+			floaterp->mAnimPreview->getDummyAvatar()->removeMotion(floaterp->mMotionID);
+		}
 		LLKeyframeDataCache::removeKeyframeData(floaterp->mMotionID);
 	}
 
diff --git a/linden/indra/newview/llfloateranimpreview.h b/linden/indra/newview/llfloateranimpreview.h
index eaab186..e8f79e2 100644
--- a/linden/indra/newview/llfloateranimpreview.h
+++ b/linden/indra/newview/llfloateranimpreview.h
@@ -32,7 +32,7 @@
 
 #ifndef LL_LLFLOATERANIMPREVIEW_H
 #define LL_LLFLOATERANIMPREVIEW_H
-#include "llagent.h"
+
 #include "llfloaternamedesc.h"
 #include "lldynamictexture.h"
 #include "llcharacter.h"
@@ -55,10 +55,7 @@ public:
 	void	pan(F32 right, F32 up);
 	virtual BOOL needsUpdate() { return mNeedsUpdate; }
 
-//	LLVOAvatar* getDummyAvatar() { return mDummyAvatar; }
-//	HACK:don't get a dummy...
-	LLVOAvatar* getDummyAvatar() { return gAgent.getAvatarObject();} 
-
+	LLVOAvatar* getDummyAvatar() { return mDummyAvatar; }
 
 protected:
 	BOOL				mNeedsUpdate;
@@ -78,13 +75,13 @@ public:
 	virtual ~LLFloaterAnimPreview();
 	
 	BOOL postBuild();
-/*
+
 	BOOL handleMouseDown(S32 x, S32 y, MASK mask);
 	BOOL handleMouseUp(S32 x, S32 y, MASK mask);
 	BOOL handleHover(S32 x, S32 y, MASK mask);
 	BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); 
 	void onMouseCaptureLost();
-*/
+
 	void refresh();
 
 	static void	onBtnPlay(void*);
@@ -127,6 +124,7 @@ protected:
 	LLAssetID			mMotionID;
 	LLTransactionID		mTransactionID;
 	BOOL				mEnabled;
+	BOOL				mInWorld;
 	LLAnimPauseRequest	mPauseRequest;
 
 	std::map<std::string, LLUUID>	mIDList;
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml b/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml
index e710d41..f2c5d34 100644
--- a/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml
+++ b/linden/indra/newview/skins/default/xui/en-us/floater_animation_preview.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <floater can_close="true" can_drag_on_left="false" can_minimize="false"
-     can_resize="false" height="286" min_height="286" min_width="300"
-     name="Animation Preview"  rect_control="PreviewAnimRect" title="" width="300">
+     can_resize="false" height="556" min_height="256" min_width="300"
+     name="Animation Preview" title="" width="300">
 	<pad height="12" />
 	<text follows="top|left" height="15" left="10" name="name_label">
 		Name:
@@ -180,7 +180,7 @@
 	<slider bottom_delta="0" follows="top|right" height="20" increment="0.0001"
 	     initial_val="0" label="" label_width="0" left="80" max_val="1" min_val="0"
 	     name="playback_slider" right="290" show_text="false" />
-	<text bottom="250" follows="top|left" left="10" name="bad_animation_text">
+	<text bottom="280" follows="top|left" left="20" name="bad_animation_text">
 		Unable to read animation file.
 
 We recommend BVH files exported from Poser 4.
@@ -202,4 +202,7 @@ Maximum animation length is [MAX_LENGTH] seconds.
 
 [STATUS]
 	</string>
+	<string name="in_world">
+		The animation preview is played on your avatar.
+	</string>
 </floater>
-- 
cgit v1.1