summaryrefslogtreecommitdiff
path: root/indra/newview/llcontrolavatar.cpp
blob: a8caba08afeb21211d50a58f8bc6bf1e6dbc303d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/**
 * @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)
{
    // AXON 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->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;
}