summaryrefslogtreecommitdiff
path: root/indra/newview/llcontrolavatar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llcontrolavatar.cpp')
-rw-r--r--indra/newview/llcontrolavatar.cpp356
1 files changed, 177 insertions, 179 deletions
diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp
index d764f64c79..b7317272a1 100644
--- a/indra/newview/llcontrolavatar.cpp
+++ b/indra/newview/llcontrolavatar.cpp
@@ -49,7 +49,7 @@ LLControlAvatar::LLControlAvatar(const LLUUID& id, const LLPCode pcode, LLViewer
mRootVolp(NULL),
mControlAVBridge(NULL),
mScaleConstraintFixup(1.0),
- mRegionChanged(false)
+ mRegionChanged(false)
{
mIsDummy = TRUE;
mIsControlAvatar = true;
@@ -59,42 +59,42 @@ LLControlAvatar::LLControlAvatar(const LLUUID& id, const LLPCode pcode, LLViewer
// virtual
LLControlAvatar::~LLControlAvatar()
{
- // Should already have been unlinked before destruction
- llassert(!mRootVolp);
+ // Should already have been unlinked before destruction
+ llassert(!mRootVolp);
}
// virtual
void LLControlAvatar::initInstance()
{
- // Potential optimizations here: avoid creating system
- // avatar mesh content since it's not used. For now we just clean some
- // things up after the fact in releaseMeshData().
+ // Potential optimizations here: avoid creating system
+ // avatar mesh content since it's not used. For now we just clean some
+ // things up after the fact in releaseMeshData().
LLVOAvatar::initInstance();
- createDrawable(&gPipeline);
- updateJointLODs();
- updateGeometry(mDrawable);
- hideSkirt();
+ createDrawable(&gPipeline);
+ updateJointLODs();
+ updateGeometry(mDrawable);
+ hideSkirt();
mInitFlags |= 1<<4;
}
const LLVOAvatar *LLControlAvatar::getAttachedAvatar() const
{
- if (mRootVolp && mRootVolp->isAttachment())
- {
- return mRootVolp->getAvatarAncestor();
- }
- return NULL;
+ if (mRootVolp && mRootVolp->isAttachment())
+ {
+ return mRootVolp->getAvatarAncestor();
+ }
+ return NULL;
}
LLVOAvatar *LLControlAvatar::getAttachedAvatar()
{
- if (mRootVolp && mRootVolp->isAttachment())
- {
- return mRootVolp->getAvatarAncestor();
- }
- return NULL;
+ if (mRootVolp && mRootVolp->isAttachment())
+ {
+ return mRootVolp->getAvatarAncestor();
+ }
+ return NULL;
}
void LLControlAvatar::getNewConstraintFixups(LLVector3& new_pos_fixup, F32& new_scale_fixup) const
@@ -104,60 +104,60 @@ void LLControlAvatar::getNewConstraintFixups(LLVector3& new_pos_fixup, F32& new_
{
max_legal_offset = gSavedSettings.getF32("AnimatedObjectsMaxLegalOffset");
}
- max_legal_offset = llmax(max_legal_offset,0.f);
+ max_legal_offset = llmax(max_legal_offset,0.f);
F32 max_legal_size = MAX_LEGAL_SIZE;
if (gSavedSettings.getControl("AnimatedObjectsMaxLegalSize"))
{
max_legal_size = gSavedSettings.getF32("AnimatedObjectsMaxLegalSize");
}
- max_legal_size = llmax(max_legal_size, 1.f);
-
+ max_legal_size = llmax(max_legal_size, 1.f);
+
new_pos_fixup = LLVector3();
new_scale_fixup = 1.0f;
- LLVector3 vol_pos = mRootVolp->getRenderPosition();
+ LLVector3 vol_pos = mRootVolp->getRenderPosition();
// Fix up position if needed to prevent visual encroachment
if (box_valid_and_non_zero(getLastAnimExtents())) // wait for state to settle down
{
- // The goal here is to ensure that the extent of the avatar's
+ // The goal here is to ensure that the extent of the avatar's
// bounding box does not wander too far from the
// official position of the corresponding volume. We
// do this by tracking the distance and applying a
// correction to the control avatar position if
// needed.
const LLVector3 *extents = getLastAnimExtents();
- LLVector3 unshift_extents[2];
- unshift_extents[0] = extents[0] - mPositionConstraintFixup;
- unshift_extents[1] = extents[1] - mPositionConstraintFixup;
+ LLVector3 unshift_extents[2];
+ unshift_extents[0] = extents[0] - mPositionConstraintFixup;
+ unshift_extents[1] = extents[1] - mPositionConstraintFixup;
LLVector3 box_dims = extents[1]-extents[0];
F32 box_size = llmax(box_dims[0],box_dims[1],box_dims[2]);
- if (!mRootVolp->isAttachment())
- {
- LLVector3 pos_box_offset = point_to_box_offset(vol_pos, unshift_extents);
- F32 offset_dist = pos_box_offset.length();
- if (offset_dist > max_legal_offset && offset_dist > 0.f)
- {
- F32 target_dist = (offset_dist - max_legal_offset);
- new_pos_fixup = (target_dist/offset_dist)*pos_box_offset;
- }
- if (new_pos_fixup != mPositionConstraintFixup)
- {
- LL_DEBUGS("ConstraintFix") << getFullname() << " pos fix, offset_dist " << offset_dist << " pos fixup "
- << new_pos_fixup << " was " << mPositionConstraintFixup << LL_ENDL;
- LL_DEBUGS("ConstraintFix") << "vol_pos " << vol_pos << LL_ENDL;
- LL_DEBUGS("ConstraintFix") << "extents " << extents[0] << " " << extents[1] << LL_ENDL;
- LL_DEBUGS("ConstraintFix") << "unshift_extents " << unshift_extents[0] << " " << unshift_extents[1] << LL_ENDL;
-
- }
- }
- if (box_size/mScaleConstraintFixup > max_legal_size)
+ if (!mRootVolp->isAttachment())
{
- new_scale_fixup = mScaleConstraintFixup*max_legal_size/box_size;
- LL_DEBUGS("ConstraintFix") << getFullname() << " scale fix, box_size " << box_size << " fixup "
- << mScaleConstraintFixup << " max legal " << max_legal_size
- << " -> new scale " << new_scale_fixup << LL_ENDL;
+ LLVector3 pos_box_offset = point_to_box_offset(vol_pos, unshift_extents);
+ F32 offset_dist = pos_box_offset.length();
+ if (offset_dist > MAX_LEGAL_OFFSET && offset_dist > 0.f)
+ {
+ F32 target_dist = (offset_dist - MAX_LEGAL_OFFSET);
+ new_pos_fixup = (target_dist/offset_dist)*pos_box_offset;
+ }
+ if (new_pos_fixup != mPositionConstraintFixup)
+ {
+ LL_DEBUGS("ConstraintFix") << getFullname() << " pos fix, offset_dist " << offset_dist << " pos fixup "
+ << new_pos_fixup << " was " << mPositionConstraintFixup << LL_ENDL;
+ LL_DEBUGS("ConstraintFix") << "vol_pos " << vol_pos << LL_ENDL;
+ LL_DEBUGS("ConstraintFix") << "extents " << extents[0] << " " << extents[1] << LL_ENDL;
+ LL_DEBUGS("ConstraintFix") << "unshift_extents " << unshift_extents[0] << " " << unshift_extents[1] << LL_ENDL;
+
+ }
+ }
+ if (box_size/mScaleConstraintFixup > MAX_LEGAL_SIZE)
+ {
+ new_scale_fixup = mScaleConstraintFixup* MAX_LEGAL_SIZE /box_size;
+ LL_DEBUGS("ConstraintFix") << getFullname() << " scale fix, box_size " << box_size << " fixup "
+ << mScaleConstraintFixup << " max legal " << MAX_LEGAL_SIZE
+ << " -> new scale " << new_scale_fixup << LL_ENDL;
}
}
}
@@ -166,20 +166,20 @@ void LLControlAvatar::matchVolumeTransform()
{
if (mRootVolp)
{
- LLVector3 new_pos_fixup;
- F32 new_scale_fixup;
- if (mRegionChanged)
- {
- new_scale_fixup = mScaleConstraintFixup;
- new_pos_fixup = mPositionConstraintFixup;
- mRegionChanged = false;
- }
- else
- {
- getNewConstraintFixups(new_pos_fixup, new_scale_fixup);
- }
- mPositionConstraintFixup = new_pos_fixup;
- mScaleConstraintFixup = new_scale_fixup;
+ LLVector3 new_pos_fixup;
+ F32 new_scale_fixup;
+ if (mRegionChanged)
+ {
+ new_scale_fixup = mScaleConstraintFixup;
+ new_pos_fixup = mPositionConstraintFixup;
+ mRegionChanged = false;
+ }
+ else
+ {
+ getNewConstraintFixups(new_pos_fixup, new_scale_fixup);
+ }
+ mPositionConstraintFixup = new_pos_fixup;
+ mScaleConstraintFixup = new_scale_fixup;
if (mRootVolp->isAttachment())
{
@@ -191,7 +191,7 @@ void LLControlAvatar::matchVolumeTransform()
{
setPositionAgent(mRootVolp->getRenderPosition());
}
- attach->updateWorldPRSParent();
+ attach->updateWorldPRSParent();
LLVector3 joint_pos = attach->getWorldPosition();
LLQuaternion joint_rot = attach->getWorldRotation();
LLVector3 obj_pos = mRootVolp->mDrawable->getPosition();
@@ -201,8 +201,7 @@ void LLControlAvatar::matchVolumeTransform()
mRoot->setWorldRotation(obj_rot * joint_rot);
setRotation(mRoot->getRotation());
- F32 global_scale = gSavedSettings.getF32("AnimatedObjectsGlobalScale");
- setGlobalScale(global_scale * mScaleConstraintFixup);
+ setGlobalScale(mScaleConstraintFixup);
}
else
{
@@ -230,30 +229,29 @@ void LLControlAvatar::matchVolumeTransform()
{
obj_rot = mRootVolp->getRotation();
}
-
- LLMatrix3 bind_mat;
+
+ LLMatrix3 bind_mat;
LLQuaternion bind_rot;
#define MATCH_BIND_SHAPE
#ifdef MATCH_BIND_SHAPE
// MAINT-8671 - based on a patch from Beq Janus
- const LLMeshSkinInfo* skin_info = mRootVolp->getSkinInfo();
- if (skin_info)
- {
+ const LLMeshSkinInfo* skin_info = mRootVolp->getSkinInfo();
+ if (skin_info)
+ {
LL_DEBUGS("BindShape") << getFullname() << " bind shape " << skin_info->mBindShapeMatrix << LL_ENDL;
bind_rot = LLSkinningUtil::getUnscaledQuaternion(LLMatrix4(skin_info->mBindShapeMatrix));
- }
+ }
#endif
- setRotation(bind_rot*obj_rot);
+ setRotation(bind_rot*obj_rot);
mRoot->setWorldRotation(bind_rot*obj_rot);
if (getRegion() && !isDead())
{
setPositionAgent(vol_pos);
}
- mRoot->setPosition(vol_pos + mPositionConstraintFixup);
+ mRoot->setPosition(vol_pos + mPositionConstraintFixup);
- F32 global_scale = gSavedSettings.getF32("AnimatedObjectsGlobalScale");
- setGlobalScale(global_scale * mScaleConstraintFixup);
+ setGlobalScale(mScaleConstraintFixup);
}
}
}
@@ -278,37 +276,37 @@ void LLControlAvatar::setGlobalScale(F32 scale)
void LLControlAvatar::recursiveScaleJoint(LLJoint* joint, F32 factor)
{
joint->setScale(factor * joint->getScale());
-
- for (LLJoint::joints_t::iterator iter = joint->mChildren.begin();
- iter != joint->mChildren.end(); ++iter)
- {
- LLJoint* child = *iter;
- recursiveScaleJoint(child, factor);
- }
+
+ for (LLJoint::joints_t::iterator iter = joint->mChildren.begin();
+ iter != joint->mChildren.end(); ++iter)
+ {
+ LLJoint* child = *iter;
+ recursiveScaleJoint(child, factor);
+ }
}
// Based on LLViewerJointAttachment::setupDrawable(), without the attaching part.
void LLControlAvatar::updateVolumeGeom()
{
- if (!mRootVolp->mDrawable)
- return;
- if (mRootVolp->mDrawable->isActive())
- {
- mRootVolp->mDrawable->makeStatic(FALSE);
- }
- mRootVolp->mDrawable->makeActive();
- gPipeline.markMoved(mRootVolp->mDrawable);
- gPipeline.markTextured(mRootVolp->mDrawable); // face may need to change draw pool to/from POOL_HUD
-
- LLViewerObject::const_child_list_t& child_list = mRootVolp->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())
- {
- gPipeline.markTextured(childp->mDrawable); // face may need to change draw pool to/from POOL_HUD
- gPipeline.markMoved(childp->mDrawable);
+ if (!mRootVolp->mDrawable)
+ return;
+ if (mRootVolp->mDrawable->isActive())
+ {
+ mRootVolp->mDrawable->makeStatic(FALSE);
+ }
+ mRootVolp->mDrawable->makeActive();
+ gPipeline.markMoved(mRootVolp->mDrawable);
+ gPipeline.markTextured(mRootVolp->mDrawable); // face may need to change draw pool to/from POOL_HUD
+
+ LLViewerObject::const_child_list_t& child_list = mRootVolp->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())
+ {
+ gPipeline.markTextured(childp->mDrawable); // face may need to change draw pool to/from POOL_HUD
+ gPipeline.markMoved(childp->mDrawable);
}
}
@@ -337,7 +335,7 @@ void LLControlAvatar::updateVolumeGeom()
// global scale, 3) approximate the original scale by looking at
// the proportions of the skeleton after joint positions have
// been applied
-
+
//LLVector3 obj_scale = obj->getScale();
//F32 obj_scale_z = llmax(obj_scale[2],0.1f);
//setGlobalScale(obj_scale_z/2.0f); // roughly fit avatar height range (2m) into object height
@@ -345,7 +343,7 @@ void LLControlAvatar::updateVolumeGeom()
LLControlAvatar *LLControlAvatar::createControlAvatar(LLVOVolume *obj)
{
- LLControlAvatar *cav = (LLControlAvatar*)gObjectList.createObjectViewer(LL_PCODE_LEGACY_AVATAR, gAgent.getRegion(), CO_FLAG_CONTROL_AVATAR);
+ LLControlAvatar *cav = (LLControlAvatar*)gObjectList.createObjectViewer(LL_PCODE_LEGACY_AVATAR, gAgent.getRegion(), CO_FLAG_CONTROL_AVATAR);
if (cav)
{
@@ -388,29 +386,29 @@ void LLControlAvatar::markDead()
bool LLControlAvatar::computeNeedsUpdate()
{
- computeUpdatePeriod();
-
- // Animesh attachments are a special case. Should have the same update cadence as their attached parent avatar.
- LLVOAvatar *attached_av = getAttachedAvatar();
- if (attached_av)
- {
- // Have to run computeNeedsUpdate() for attached av in
- // case it hasn't run updateCharacter() already this
- // frame. Note this means that the attached av will
- // run computeNeedsUpdate() multiple times per frame
- // if it has animesh attachments. Results will be
- // consistent except for the corner case of exceeding
- // MAX_IMPOSTOR_INTERVAL in one call but not another,
- // which should be rare.
- attached_av->computeNeedsUpdate();
- mNeedsImpostorUpdate = attached_av->mNeedsImpostorUpdate;
- if (mNeedsImpostorUpdate)
- {
- mLastImpostorUpdateReason = 12;
- }
- return mNeedsImpostorUpdate;
- }
- return LLVOAvatar::computeNeedsUpdate();
+ computeUpdatePeriod();
+
+ // Animesh attachments are a special case. Should have the same update cadence as their attached parent avatar.
+ LLVOAvatar *attached_av = getAttachedAvatar();
+ if (attached_av)
+ {
+ // Have to run computeNeedsUpdate() for attached av in
+ // case it hasn't run updateCharacter() already this
+ // frame. Note this means that the attached av will
+ // run computeNeedsUpdate() multiple times per frame
+ // if it has animesh attachments. Results will be
+ // consistent except for the corner case of exceeding
+ // MAX_IMPOSTOR_INTERVAL in one call but not another,
+ // which should be rare.
+ attached_av->computeNeedsUpdate();
+ mNeedsImpostorUpdate = attached_av->mNeedsImpostorUpdate;
+ if (mNeedsImpostorUpdate)
+ {
+ mLastImpostorUpdateReason = 12;
+ }
+ return mNeedsImpostorUpdate;
+ }
+ return LLVOAvatar::computeNeedsUpdate();
}
bool LLControlAvatar::updateCharacter(LLAgent &agent)
@@ -421,7 +419,7 @@ bool LLControlAvatar::updateCharacter(LLAgent &agent)
//virtual
void LLControlAvatar::updateDebugText()
{
- if (gSavedSettings.getBOOL("DebugAnimatedObjects"))
+ if (gSavedSettings.getBOOL("DebugAnimatedObjects"))
{
S32 total_linkset_count = 0;
if (mRootVolp)
@@ -504,7 +502,7 @@ void LLControlAvatar::updateDebugText()
}
}
addDebugText(llformat("CAV obj %d anim %d active %s impost %d upprd %d strcst %f",
- total_linkset_count, animated_volume_count,
+ total_linkset_count, animated_volume_count,
active_string.c_str(), (S32) isImpostor(), getUpdatePeriod(), streaming_cost));
addDebugText(llformat("types %s lods %s", type_string.c_str(), lod_string.c_str()));
addDebugText(llformat("flags %s", animated_object_flag_string.c_str()));
@@ -513,13 +511,13 @@ void LLControlAvatar::updateDebugText()
addDebugText(llformat("lod_radius %s dists %s", LLStringOps::getReadableNumber(lod_radius).c_str(),cam_dist_string.c_str()));
if (mPositionConstraintFixup.length() > 0.0f || mScaleConstraintFixup != 1.0f)
{
- addDebugText(llformat("pos fix (%.1f %.1f %.1f) scale %f",
- mPositionConstraintFixup[0],
+ addDebugText(llformat("pos fix (%.1f %.1f %.1f) scale %f",
+ mPositionConstraintFixup[0],
mPositionConstraintFixup[1],
mPositionConstraintFixup[2],
mScaleConstraintFixup));
}
-
+
#if 0
std::string region_name = "no region";
if (mRootVolp->getRegion())
@@ -535,7 +533,7 @@ void LLControlAvatar::updateDebugText()
mRootVolp->getRegion(), region_name.c_str(),
getRegion(), skel_region_name.c_str()));
#endif
-
+
}
LLVOAvatar::updateDebugText();
}
@@ -548,12 +546,12 @@ void LLControlAvatar::getAnimatedVolumes(std::vector<LLVOVolume*>& volumes)
}
volumes.push_back(mRootVolp);
-
- LLViewerObject::const_child_list_t& child_list = mRootVolp->getChildren();
- for (LLViewerObject::const_child_list_t::const_iterator iter = child_list.begin();
- iter != child_list.end(); ++iter)
- {
- LLViewerObject* childp = *iter;
+
+ LLViewerObject::const_child_list_t& child_list = mRootVolp->getChildren();
+ for (LLViewerObject::const_child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); ++iter)
+ {
+ LLViewerObject* childp = *iter;
LLVOVolume *child_volp = dynamic_cast<LLVOVolume*>(childp);
if (child_volp && child_volp->isAnimatedObject())
{
@@ -575,9 +573,9 @@ void LLControlAvatar::updateAnimations()
std::vector<LLVOVolume*> volumes;
getAnimatedVolumes(volumes);
-
+
// Rebuild mSignaledAnimations from the associated volumes.
- std::map<LLUUID, S32> anims;
+ std::map<LLUUID, S32> anims;
for (std::vector<LLVOVolume*>::iterator vol_it = volumes.begin(); vol_it != volumes.end(); ++vol_it)
{
LLVOVolume *volp = *vol_it;
@@ -617,27 +615,27 @@ void LLControlAvatar::updateAnimations()
// virtual
LLViewerObject* LLControlAvatar::lineSegmentIntersectRiggedAttachments(const LLVector4a& start, const LLVector4a& end,
- S32 face,
- BOOL pick_transparent,
- BOOL pick_rigged,
+ S32 face,
+ BOOL pick_transparent,
+ BOOL pick_rigged,
BOOL pick_unselectable,
- S32* face_hit,
- LLVector4a* intersection,
- LLVector2* tex_coord,
- LLVector4a* normal,
- LLVector4a* tangent)
+ S32* face_hit,
+ LLVector4a* intersection,
+ LLVector2* tex_coord,
+ LLVector4a* normal,
+ LLVector4a* tangent)
{
if (!mRootVolp)
{
return NULL;
}
- LLViewerObject* hit = NULL;
+ LLViewerObject* hit = NULL;
- if (lineSegmentBoundingBox(start, end))
- {
- LLVector4a local_end = end;
- LLVector4a local_intersection;
+ if (lineSegmentBoundingBox(start, end))
+ {
+ LLVector4a local_end = end;
+ LLVector4a local_intersection;
if (mRootVolp->lineSegmentIntersect(start, local_end, face, pick_transparent, pick_rigged, pick_unselectable, face_hit, &local_intersection, tex_coord, normal, tangent))
{
local_end = local_intersection;
@@ -667,9 +665,9 @@ LLViewerObject* LLControlAvatar::lineSegmentIntersectRiggedAttachments(const LLV
}
}
}
- }
-
- return hit;
+ }
+
+ return hit;
}
// virtual
@@ -688,34 +686,34 @@ std::string LLControlAvatar::getFullname() const
// virtual
bool LLControlAvatar::shouldRenderRigged() const
{
- const LLVOAvatar *attached_av = getAttachedAvatar();
- if (attached_av)
- {
- return attached_av->shouldRenderRigged();
- }
+ const LLVOAvatar *attached_av = getAttachedAvatar();
+ if (attached_av)
+ {
+ return attached_av->shouldRenderRigged();
+ }
return true;
}
// virtual
BOOL LLControlAvatar::isImpostor()
{
- // Attached animated objects should match state of their attached av.
- LLVOAvatar *attached_av = getAttachedAvatar();
- if (attached_av)
- {
- return attached_av->isImpostor();
- }
- return LLVOAvatar::isImpostor();
+ // Attached animated objects should match state of their attached av.
+ LLVOAvatar *attached_av = getAttachedAvatar();
+ if (attached_av)
+ {
+ return attached_av->isImpostor();
+ }
+ return LLVOAvatar::isImpostor();
}
//static
void LLControlAvatar::onRegionChanged()
{
- std::vector<LLCharacter*>::iterator it = LLCharacter::sInstances.begin();
- for ( ; it != LLCharacter::sInstances.end(); ++it)
- {
- LLControlAvatar* cav = dynamic_cast<LLControlAvatar*>(*it);
- if (!cav) continue;
- cav->mRegionChanged = true;
- }
+ std::vector<LLCharacter*>::iterator it = LLCharacter::sInstances.begin();
+ for ( ; it != LLCharacter::sInstances.end(); ++it)
+ {
+ LLControlAvatar* cav = dynamic_cast<LLControlAvatar*>(*it);
+ if (!cav) continue;
+ cav->mRegionChanged = true;
+ }
}