summaryrefslogtreecommitdiff
path: root/indra/newview/llcontrolavatar.cpp
diff options
context:
space:
mode:
authorBrad Payne (Vir Linden) <vir@lindenlab.com>2017-06-07 14:23:49 +0100
committerBrad Payne (Vir Linden) <vir@lindenlab.com>2017-06-07 14:23:49 +0100
commitc9baf4c66157c601cc4d4e325c7843b3bf9a0cad (patch)
tree20c09129ce8e72b8731c6c109c9e2a600783df44 /indra/newview/llcontrolavatar.cpp
parent74957676fc0b05825abc3af907241479f06fa8c3 (diff)
SL-691,SL-694 - viewer can animate objects based on server messaging. First end-to-end demo for animated objects.
Diffstat (limited to 'indra/newview/llcontrolavatar.cpp')
-rw-r--r--indra/newview/llcontrolavatar.cpp119
1 files changed, 119 insertions, 0 deletions
diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp
new file mode 100644
index 0000000000..1ecd3305ed
--- /dev/null
+++ b/indra/newview/llcontrolavatar.cpp
@@ -0,0 +1,119 @@
+/**
+ * @file llcontrolavatar.cpp
+ * @brief Implementation for special dummy avatar used to drive rigged meshes.
+ *
+ * $LicenseInfo:firstyear=2017&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2017, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llcontrolavatar.h"
+#include "llagent.h" // Get state values from here
+#include "llviewerobjectlist.h"
+#include "pipeline.h"
+#include "llanimationstates.h"
+
+LLControlAvatar::LLControlAvatar(const LLUUID& id, const LLPCode pcode, LLViewerRegion* regionp) :
+ LLVOAvatar(id, pcode, regionp),
+ mPlaying(false)
+{
+ mIsControlAvatar = true;
+}
+
+// virtual
+LLControlAvatar::~LLControlAvatar()
+{
+}
+
+void LLControlAvatar::matchTransform(LLVOVolume *obj)
+{
+ setPositionAgent(obj->getRenderPosition());
+ //slamPosition();
+
+ LLQuaternion fix_axes_rot(-F_PI_BY_TWO, LLVector3(0,0,1));
+ LLQuaternion obj_rot = obj->getRotation();
+ LLQuaternion result_rot = fix_axes_rot * obj_rot;
+ setRotation(result_rot);
+ mRoot->setWorldRotation(result_rot);
+ mRoot->setPosition(obj->getRenderPosition());
+}
+
+// Based on LLViewerJointAttachment::setupDrawable(), without the attaching part.
+void LLControlAvatar::updateGeom(LLVOVolume *obj)
+{
+ if (!obj->mDrawable)
+ return;
+ if (obj->mDrawable->isActive())
+ {
+ obj->mDrawable->makeStatic(FALSE);
+ }
+ obj->mDrawable->makeActive();
+ gPipeline.markMoved(obj->mDrawable);
+ gPipeline.markTextured(obj->mDrawable); // face may need to change draw pool to/from POOL_HUD
+ obj->mDrawable->setState(LLDrawable::USE_BACKLIGHT);
+
+ LLViewerObject::const_child_list_t& child_list = obj->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); ++iter)
+ {
+ LLViewerObject* childp = *iter;
+ if (childp && childp->mDrawable.notNull())
+ {
+ childp->mDrawable->setState(LLDrawable::USE_BACKLIGHT);
+ gPipeline.markTextured(childp->mDrawable); // face may need to change draw pool to/from POOL_HUD
+ gPipeline.markMoved(childp->mDrawable);
+ }
+ }
+
+ gPipeline.markRebuild(obj->mDrawable, LLDrawable::REBUILD_ALL, TRUE);
+ obj->markForUpdate(TRUE);
+
+ matchTransform(obj);
+ //addAttachmentOverridesForObject(obj);
+}
+
+LLControlAvatar *LLControlAvatar::createControlAvatar(LLVOVolume *obj)
+{
+ // TRIF Lifted from LLPreviewAnimation
+ LLControlAvatar *cav = (LLControlAvatar*)gObjectList.createObjectViewer(LL_PCODE_LEGACY_AVATAR, gAgent.getRegion(), CO_FLAG_CONTROL_AVATAR);
+ cav->createDrawable(&gPipeline);
+ cav->mIsDummy = TRUE;
+ cav->mSpecialRenderMode = 1;
+ //cav->setPositionAgent(obj->getRenderPosition());
+ //cav->slamPosition();
+ //cav->setRotation(obj->getRotation());
+ cav->updateJointLODs();
+ cav->updateGeometry(cav->mDrawable);
+ cav->startMotion(ANIM_AGENT_STAND, 5.0f);
+ cav->hideSkirt();
+
+ // stop extraneous animations
+ cav->stopMotion( ANIM_AGENT_HEAD_ROT, TRUE );
+ cav->stopMotion( ANIM_AGENT_EYE, TRUE );
+ cav->stopMotion( ANIM_AGENT_BODY_NOISE, TRUE );
+ cav->stopMotion( ANIM_AGENT_BREATHE_ROT, TRUE );
+
+ // Sync up position/rotation with object
+ cav->matchTransform(obj);
+
+ return cav;
+}
+