From 38d6d37f2d982fa959e9e8a4a3f7e1ccfad7b5d4 Mon Sep 17 00:00:00 2001 From: Jacek Antonelli Date: Fri, 15 Aug 2008 23:44:46 -0500 Subject: Second Life viewer sources 1.13.2.12 --- linden/indra/newview/llpreviewanim.cpp | 216 +++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 linden/indra/newview/llpreviewanim.cpp (limited to 'linden/indra/newview/llpreviewanim.cpp') diff --git a/linden/indra/newview/llpreviewanim.cpp b/linden/indra/newview/llpreviewanim.cpp new file mode 100644 index 0000000..bd619b4 --- /dev/null +++ b/linden/indra/newview/llpreviewanim.cpp @@ -0,0 +1,216 @@ +/** + * @file llpreviewanim.cpp + * @brief LLPreviewAnim class implementation + * + * Copyright (c) 2004-2007, Linden Research, Inc. + * + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + */ + +#include "llviewerprecompiledheaders.h" + +#include "llpreviewanim.h" +#include "llbutton.h" +#include "llresmgr.h" +#include "llinventory.h" +#include "llinventoryview.h" +#include "llvoavatar.h" +#include "llagent.h" // gAgent +#include "llkeyframemotion.h" +#include "llfilepicker.h" +#include "lllineeditor.h" +#include "lluictrlfactory.h" +#include "llvieweruictrlfactory.h" + +extern LLAgent gAgent; + +LLPreviewAnim::LLPreviewAnim(const std::string& name, const LLRect& rect, const std::string& title, const LLUUID& item_uuid, const S32& activate, const LLUUID& object_uuid ) : + LLPreview( name, rect, title, item_uuid, object_uuid) +{ + gUICtrlFactory->buildFloater(this,"floater_preview_animation.xml"); + + childSetAction("Anim play btn",playAnim,this); + childSetAction("Anim audition btn",auditionAnim,this); + + LLInventoryItem* item = getItem(); + + childSetCommitCallback("desc", LLPreview::onText, this); + childSetText("desc", item->getDescription()); + childSetPrevalidate("desc", &LLLineEditor::prevalidatePrintableNotPipe); + + setTitle(title); + + if (!getHost()) + { + LLRect curRect = getRect(); + translate(rect.mLeft - curRect.mLeft, rect.mTop - curRect.mTop); + } + + // preload the animation + if(item) + { + gAgent.getAvatarObject()->createMotion(item->getAssetUUID()); + } + + switch ( activate ) + { + case 1: + { + playAnim( (void *) this ); + break; + } + case 2: + { + auditionAnim( (void *) this ); + break; + } + default: + { + //do nothing + } + } +} + +// static +void LLPreviewAnim::endAnimCallback( void *userdata ) +{ + LLPreviewAnim* self = (LLPreviewAnim*) userdata; + + self->childSetValue("Anim play btn", FALSE); + self->childSetValue("Anim audition btn", FALSE); + +} + +// static +void LLPreviewAnim::playAnim( void *userdata ) +{ + LLPreviewAnim* self = (LLPreviewAnim*) userdata; + LLInventoryItem *item = self->getItem(); + + if(item) + { + LLUUID itemID=item->getAssetUUID(); + + LLButton* btn = LLUICtrlFactory::getButtonByName(self, "Anim play btn"); + if (btn) + { + btn->toggleState(); + } + + if (self->childGetValue("Anim play btn").asBoolean() ) + { + self->mPauseRequest = NULL; + gAgent.sendAnimationRequest(itemID, ANIM_REQUEST_START); + + LLVOAvatar* avatar = gAgent.getAvatarObject(); + LLMotion* motion = avatar->findMotion(itemID); + + if (motion) + motion->setDeactivateCallback(&endAnimCallback, (void *)self); + } + else + { + gAgent.getAvatarObject()->stopMotion(itemID); + gAgent.sendAnimationRequest(itemID, ANIM_REQUEST_STOP); + } + } +} + +// static +void LLPreviewAnim::auditionAnim( void *userdata ) +{ + LLPreviewAnim* self = (LLPreviewAnim*) userdata; + LLInventoryItem *item = self->getItem(); + + if(item) + { + LLUUID itemID=item->getAssetUUID(); + + LLButton* btn = LLUICtrlFactory::getButtonByName(self, "Anim audition btn"); + if (btn) + { + btn->toggleState(); + } + + if (self->childGetValue("Anim audition btn").asBoolean() ) + { + self->mPauseRequest = NULL; + gAgent.getAvatarObject()->startMotion(item->getAssetUUID()); + + LLVOAvatar* avatar = gAgent.getAvatarObject(); + LLMotion* motion = avatar->findMotion(itemID); + + if (motion) + motion->setDeactivateCallback(&endAnimCallback, (void *)self); + } + else + { + gAgent.getAvatarObject()->stopMotion(itemID); + gAgent.sendAnimationRequest(itemID, ANIM_REQUEST_STOP); + } + } +} + +void LLPreviewAnim::saveAnim( void *userdata ) +{ + LLPreviewAnim* self = (LLPreviewAnim*) userdata; + LLInventoryItem *item = self->getItem(); + + if(item) + { + LLKeyframeMotion* motionp = (LLKeyframeMotion*)gAgent.getAvatarObject()->createMotion( item->getAssetUUID() ); + if (motionp && motionp->isLoaded()) + { + LLFilePicker& picker = LLFilePicker::instance(); + LLString proposed_name = item->getName() + LLString(".xaf"); + if (picker.getSaveFile(LLFilePicker::FFSAVE_ANIM, proposed_name.c_str())) + { + apr_file_t* fp = ll_apr_file_open(picker.getFirstFile(), LL_APR_W); + if (!fp) + { + llwarns << "Unable to open file " << picker.getFirstFile() << llendl; + return; + } + motionp->writeCAL3D(fp); + apr_file_close(fp); + } + } + } +} + +void LLPreviewAnim::onClose(bool app_quitting) +{ + LLInventoryItem *item = getItem(); + + if(item) + { + gAgent.getAvatarObject()->stopMotion(item->getAssetUUID()); + gAgent.sendAnimationRequest(item->getAssetUUID(), ANIM_REQUEST_STOP); + + LLVOAvatar* avatar = gAgent.getAvatarObject(); + LLMotion* motion = avatar->findMotion(item->getAssetUUID()); + + if (motion) + motion->setDeactivateCallback(NULL, (void *)NULL); + + } + destroy(); +} -- cgit v1.1